簡體   English   中英

別名方法鏈,方法未定義

[英]Alias method chain with method not defined

我有一個模塊,包含在Rails Observer中。

目的是:

  • 調用after_saveafter_update一個名為check_integrity的方法
  • 如果在Observer中定義,則在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM