Dla każdego, kto zobaczy to później, ponieważ obecnie (sierpień 2017) jest na szczycie Google: Warto wspomnieć, że to zachowanie zostanie zmienione w Railsach 5.2 i ma ostrzeżenia o wycofaniu z Railsów 5.1, jako ActiveModel :: Dirty zmienił się nieco .
Co mam zmienić?
Jeśli używasz attribute_changed?metody w after_*-callbacks, zobaczysz ostrzeżenie takie jak:
OSTRZEŻENIE O DEPRECATION: Zachowanie attribute_changed?inside lub after callbacka ulegnie zmianie w następnej wersji Railsów. Nowa wartość zwracana będzie odzwierciedlać zachowanie wywołania metody po savezwróceniu (np. Przeciwieństwo tego, co zwraca teraz). Aby zachować bieżące zachowanie, użyj saved_change_to_attribute?zamiast tego. (wywoływane z some_callback pod adresem /PATH_TO/app/models/user.rb:15)
Jak wspomniano, można to łatwo naprawić, zastępując funkcję saved_change_to_attribute?. Na przykład name_changed?staje się saved_change_to_name?.
Podobnie, jeśli używasz attribute_changedo uzyskania wartości przed-po, to również się zmieni i wyrzuci następujące:
OSTRZEŻENIE O DEPRECATION: Zachowanie attribute_changeinside lub after callbacka ulegnie zmianie w następnej wersji Railsów. Nowa wartość zwracana będzie odzwierciedlać zachowanie wywołania metody po savezwróceniu (np. Przeciwieństwo tego, co zwraca teraz). Aby zachować bieżące zachowanie, użyj saved_change_to_attributezamiast tego. (wywoływane z some_callback pod adresem /PATH_TO/app/models/user.rb:20)
Ponownie, jak wspomniano, metoda zmienia nazwę, do saved_change_to_attributektórej zwraca ["old", "new"]. lub use saved_changes, co zwraca wszystkie zmiany, a te są dostępne jako saved_changes['attribute'].