cwninja的答案应该做的伎俩,但有一点点它。
首先,基本属性处理是通过write_attribute方法完成的,因此您应该点击此处。
Rails也有一个内置的回调结构,虽然它不允许传递带有点烦恼的参数,但可以很好地利用它。
使用自定义的回调,你可以做这样的:
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
如果您想尝试使用Rails的回调(尤其是有用的,如果你可能有多个回调和/或子类),你可以做这样的事情:
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
彼得,这是美丽的,将为我节省一大笔“write_attribute”,我遍布我的代码。谢谢! – BushyMark 2009-10-04 00:32:34
似乎这只适用于Rails 2。 – lulalala 2013-10-23 10:41:19
通过谷歌来到这个没有检查日期。这个更近期的演练做了我所需要的:[如何跟踪'after_callbacks'中模型的变化](http://ruby-journal.com/how-to-track-changes-with-after-callbacks-in- rails-3-or-newer /) – Jay 2014-07-03 19:10:03