Skip to main content
 首页 » 编程设计

ruby-on-rails之向 Rails 观察者传递额外的参数

2025年12月25日22cyq1162

我在 Account 模型中有几种方法:我希望我的 AccountObserver 观看支付、接收、退款等。但我想将额外的对象传递给我的 AccountObserver。

例如,在我的 Account 模型中,我想定义:

def pay 
  ... 
  notify_observers(:after_pay, payee, amount) 
 
end 

我该怎么做?

谢谢你。

请您参考如下方法:

不要覆盖 notify_observers。修补核心类是一个非常糟糕的主意。相反,你应该做的是:

而不是调用 instance method在仅限于方法名称的模型上,自己调用类方法:

# Notify list of observers of a change. 
def notify_observers(*arg) 
  observer_instances.each { |observer| observer.update(*arg) } 
end 

它将您提供的任何参数传递给观察者的#update 方法,您可以在自己的观察者类中覆盖该方法。

默认不接受任何无关的参数,但不是太复杂:
def update(observed_method, object, &block) #:nodoc: 
  return unless respond_to?(observed_method) 
  return if disabled_for?(object) 
  send(observed_method, object, &block) 
end 

因此,只需将其添加到您的观察者,例如:
def update(observed_method, object, *args) 
  return unless respond_to?(observed_method) 
  return if disabled_for?(object) 
  send(observed_method, object, *args) 
end 
 
def after_pay(payee, amount) 
  ... 
end 

并打电话
Payee.notify_observers(:after_pay, payee, amount)