我有一个包含在Rails Observer中的模块。
目的是:
after_save
和after_update
上调用名为check_integrity
check_integrity
或/和after_save
结束时致电after_update
。 因此,简而言之,应始终致电check_integrity
。
我尝试了类似以下代码的内容:
module IntegrityObserver
extend ActiveSupport::Concern
included do
alias_method_chain :after_save, :check_integrity
alias_method_chain :after_update, :check_integrity
end
def check_integrity
# do something
end
end
class UserObserver < ActiveRecord::Observer
include IntegrityObserver
def after_save(object)
# do something
end
end
但它引发了错误:activesupport-3.0.17/lib/active_support/core_ext/module/aliasing.rb:31:in alias_method': undefined method after_update' for class TaskObserver' (NameError)
有人知道我怎么能做我想做的事吗?
谢谢!
答案 0 :(得分:1)
ActiveRecord已提供观察器功能来监控模型的生命周期。以下是如何注册响应多个模型的通用观察器:
class AuditObserver < ActiveRecord::Observer
observe :account, :balance
def after_update(record)
AuditTrail.new(record, "UPDATED")
end
end
在config / application.rb文件中:
config.active_record.observers = :audit_observer
查看更多示例here。
答案 1 :(得分:1)
alias_method_chain无法正常工作。如果您定义类似:
alias_method_chain :after_save, :check_integrity
您必须定义以下方法:
def after_save_with_check_integrity(*args)
# do something
# you can call the original after_save by calling:
# after_save_without_check_integrity(*args)
end
请注意,alias_method_chain的使用在大多数情况下被认为是一种不好的做法。
答案 2 :(得分:0)
与模型不同,观察者没有预定义的回调方法,例如after_save,after_update。所以你得到了一个“未定义的方法”错误。
你可以这样做,
module IntegrityObserver
extend ActiveSupport::Concern
def after_save(record)
check_integrity
end
def after_update(record)
check_integrity
end
def check_integrity
# do something
end
end