0

Rails Observer 内に含まれるモジュールがあります。

目的は次のとおりです。

  • 呼び出してafter_saveafter_updateという名前のメソッドcheck_integrity
  • Observer で定義されている場合は、 or/andcheck_integrityの最後で呼び出します。after_saveafter_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 に答える
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 に答える