[英]Alias method chain with method not defined
我有一個模塊,包含在Rails Observer中。
目的是:
after_save
和after_update
一個名為check_integrity
的方法 after_save
或/和after_update
結束時調用check_integrity
。 所以簡而言之,它應該總是調用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)
有人知道我怎么能做我想做的事嗎?
謝謝!
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
在這里查看更多示例。
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的使用在大多數情況下被認為是一種不好的做法。
與模型不同,觀察者沒有預定義的回調方法,例如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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.