0

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

目的是:

  • 调用after_saveafter_update一个名为的方法check_integrity
  • check_integrityafter_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)

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

谢谢!

4

3 回答 3

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

在此处查看更多示例。

于 2012-10-12T02:17:53.627 回答
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 被认为是一种不好的做法。

于 2012-10-12T07:58:52.690 回答
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
于 2012-10-12T08:38:01.623 回答