La risposta di cwninja dovrebbe fare il trucco, ma c'è un po 'di più.
Prima di tutto, la gestione degli attributi di base viene eseguita con il metodo write_attribute, quindi è necessario utilizzarlo.
Rails ha anche una struttura di callback incorporata che potrebbe essere piacevole da usare anche se non consente di passare argomenti che sono un po 'fastidiosi.
Uso callback personalizzate che si poteva fare in questo modo:
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
Se si voleva cercare di utilizzare Rails callback (particolarmente utile se si potrebbe avere più callback e/o sottoclasse) si potrebbe fare qualcosa di simile :
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
fonte
2009-10-03 23:49:28
Peter, che bello, mi ha salvato un TON di "write_attribute" che ho sparpagliato in tutto il mio codice. Grazie! – BushyMark
Sembra che questo sia solo per Rails 2. – lulalala
È arrivato a questo tramite google senza verificare la data. Questo passo più recente ha fatto ciò di cui avevo bisogno: [Come tenere traccia delle modifiche di un modello in un 'after_callbacks'] (http://ruby-journal.com/how-to-track-changes-with-after-callbacks-in- rails-3-or-newer /) – Jay