cwninjas Antwort sollte den Trick machen, aber es gibt ein bisschen mehr dazu.
Zunächst erfolgt die Verarbeitung des Basisattributs mit der Methode write_attribute, sodass Sie darauf zugreifen sollten.
Rails hat auch eine eingebaute Callback-Struktur, die schön sein könnte, obwohl es nicht erlaubt, Argumente zu übergeben, die ein bisschen ärgerlich ist.
Verwenden von benutzerdefinierten Rückrufe Sie könnte es wie folgt tun:
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
Wenn Sie versuchen wollte Rails Rückrufe verwenden (besonders nützlich, wenn Sie mehrere Rückrufe und/oder Unterklassen haben könnte), die Sie so etwas tun könnte :
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, das ist schön, werde mich retten eine TON von "write_attribute" Ich habe überall auf meinem Code verstreut. Vielen Dank! – BushyMark
Scheint, das ist nur für Rails 2. – lulalala
Kam zu diesem über Google ohne Datum zu überprüfen. Dieser neuere Durchlauf hat getan, was ich brauchte: [Wie man Änderungen eines Modells in einem 'after_callbacks' verfolgt (http://ruby-journal.com/how-to-track-changes-with-after-callbacks-in-) rails-3-or-newer /) – Jay