Ustawiam wywołanie zwrotne after_save w obserwatorze modelu, aby wysłać powiadomienie tylko wtedy, gdy atrybut opublikowania modelu został zmieniony z false na true. Od kiedy zmieniły się takie metody ? są przydatne tylko przed zapisaniem modelu, sposób, w jaki obecnie (i bezskutecznie) próbuję to zrobić, jest następujący:
def before_save(blog)
@og_published = blog.published?
end
def after_save(blog)
if @og_published == false and blog.published? == true
Notification.send(...)
end
end
Czy ktoś ma jakieś sugestie, jak najlepiej sobie z tym poradzić, najlepiej używając wywołań zwrotnych obserwatora modelu (aby nie zanieczyszczać mojego kodu kontrolera)?
źródło
after_update
wywołania:after_update :send_notification_after_change, if: -> { published_changed? }
saved_change_to_published?
lubsaved_change_to_published
pobrać zmianę podczas oddzwanianiaDla tych, którzy chcą poznać zmiany wprowadzone właśnie w
after_save
oddzwonieniu:Rails 5.1 i nowsze
Szyny <5.1
Zobacz także: http://api.rubyonrails.org/classes/ActiveModel/Dirty.html#method-i-previous_changes
źródło
after_save
wywołania zwrotnego,self.changed?
jesttrue
iself.attribute_name_changed?
jest równieżtrue
, aleself.previous_changes
zwraca pusty hash.saved_changes
wafter_save
callbackachDla 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 wafter_*
-callbacks, zobaczysz ostrzeżenie takie jak:Jak wspomniano, można to łatwo naprawić, zastępując funkcję
saved_change_to_attribute?
. Na przykładname_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:Ponownie, jak wspomniano, metoda zmienia nazwę, do
saved_change_to_attribute
której zwraca["old", "new"]
. lub usesaved_changes
, co zwraca wszystkie zmiany, a te są dostępne jakosaved_changes['attribute']
.źródło
attribute_was
metod: użyjsaved_change_to_attribute
zamiast tego.Jeśli możesz to zrobić
before_save
zamiastafter_save
, będziesz mógł użyć tego:zwraca tablicę wszystkich zmienionych kolumn w tym rekordzie.
możesz także użyć:
która zwraca skrót kolumn, które uległy zmianie oraz wyniki przed i po jako tablice
źródło
after_
wywołaniu zwrotnym, o co właściwie chodziło w tym pytaniu. Odpowiedź @ jacek-głodek poniżej jest prawidłowa.before_save
self.changed
może być używany wafter_save
callbackach.self.changed
jest tablica ciągów! (Nie symbole!)["attr_name", "other_attr_name"]
„Wybrana” odpowiedź nie działa dla mnie. Używam rails 3.1 z CouchRest :: Model (na podstawie Active Model). Te
_changed?
metody nie zwróci true dla zmienionych atrybutów wafter_update
haku, tylko wbefore_update
haku. Udało mi się go uruchomić za pomocą (nowego?)around_update
Haka:źródło
możesz dodać warunek do czegoś
after_update
podobnego, tak:nie ma potrzeby dodawania warunku w
send_notification
samej metodzie.źródło
Wystarczy dodać akcesor, który określa, co zmieniasz
źródło