Odpowiedź cwninja powinna załatwić sprawę, ale jest w tym trochę więcej.
Po pierwsze, obsługa atrybutów bazowych jest wykonywana za pomocą metody write_attribute, więc powinieneś naciskać na nią.
Szyny również mają wbudowaną strukturę wywołań zwrotnych, która mogłaby być przyjemna w użyciu, chociaż nie pozwala na przekazywanie argumentów, co jest trochę irytujące.
pomocą Custom callbacks można zrobić to tak:
class Person < ActiveRecord::Base
def write_attribute(attr_name, value)
attribute_changed(attr_name, read_attribute(attr_name), value)
super
end
private
def attribute_changed(attr, old_val, new_val)
logger.info "Attribute Changed: #{attr} from #{old_val} to #{new_val}"
end
end
Jeśli chciał spróbować użyć Rails wywołania zwrotne (szczególnie przydatne, jeśli można mieć wiele zwrotnych i/lub podklasy) można zrobić coś takiego :
class Person < ActiveRecord::Base
define_callbacks :attribute_changed
attribute_changed :notify_of_attribute_change
def write_attribute(attr_name, value)
returning(super) do
@last_changed_attr = attr_name
run_callbacks(:attribute_changed)
end
end
private
def notify_of_attribute_change
attr = @last_changed_attr
old_val, new_val = send("#{attr}_change")
logger.info "Attribute Changed: #{attr} from #{old_val} to #{new_val}"
end
end
Peter, to jest piękne, zamierzam zaoszczędzić mi TON "write_attribute", które zasypałem całym moim kodem. Dzięki! – BushyMark
Wydaje się, że dotyczy to tylko Rails 2. – lulalala
Doszło do tego przez google bez sprawdzania daty. Ta nowsza instrukcja zrobiła to, czego potrzebowałem: [Jak śledzić zmiany modelu w 'after_callbacks'] (http://ruby-journal.com/how-to-track-changes-with-after-callbacks-in- rails-3-or-newer /) – Jay