别名方法链,方法未定义

时间:2012-10-12 01:27:14

标签: ruby-on-rails ruby metaprogramming alias-method-chain

我有一个包含在Rails Observer中的模块。

目的是:

  • after_saveafter_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)

有人知道我怎么能做我想做的事吗?

谢谢!

3 个答案:

答案 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