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 save
zwró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_change
do uzyskania wartości przed-po, to również się zmieni i wyrzuci następujące:
OSTRZEŻENIE O DEPRECATION: Zachowanie attribute_change
inside lub after callbacka ulegnie zmianie w następnej wersji Railsów. Nowa wartość zwracana będzie odzwierciedlać zachowanie wywołania metody po save
zwró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:20)
Ponownie, jak wspomniano, metoda zmienia nazwę, do saved_change_to_attribute
której zwraca ["old", "new"]
. lub use saved_changes
, co zwraca wszystkie zmiany, a te są dostępne jako saved_changes['attribute']
.