我在帳戶模型中有幾種方法:支付,接收,退款等,以便我需要AccountObserver觀看。但我想傳遞額外的對象到我的AccountObserver。將額外參數傳遞給Rails觀察者
例如,在我的帳戶模式,我想定義:
def pay
...
notify_observers(:after_pay, payee, amount)
end
我應該怎樣做呢?
謝謝。
我在帳戶模型中有幾種方法:支付,接收,退款等,以便我需要AccountObserver觀看。但我想傳遞額外的對象到我的AccountObserver。將額外參數傳遞給Rails觀察者
例如,在我的帳戶模式,我想定義:
def pay
...
notify_observers(:after_pay, payee, amount)
end
我應該怎樣做呢?
謝謝。
恐怕這對於觀察者來說不是一個很好的用例。我能想到的最好的辦法,沒有完全準備不同的路線,就是你的帳戶的對象,然後可以在觀察訪問,例如:
class Account < ActiveRecord::Base
attr_reader :last_payment
def pay payee, amt
@last_payment = [ payee, amt ]
notify_observers :after_pay
end
end
class AccountObserver < ActiveRecord::Observer
def after_pay account
payee, amt = account.last_payment
Rails.logger.info "#{payee} paid #{amt}!"
end
end
謝謝,喬丹。我查看了源代碼,並意識到我必須重寫notify_observers才能執行我想要的操作。 – AdamNYC 2012-02-23 22:39:46
不要覆蓋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)
這太好了,FX!非常感謝。 – AdamNYC 2012-05-12 17:00:11
感謝您的支持!我發現我需要自己調用類級別的notify_observers,但仍然無法工作。這幫助我瞭解到我需要修改觀察者本身的'update'實例方法。 – 2013-02-17 20:53:27
遲到的反應,但我希望有人會發現它有幫助。
首先,它似乎being fixed in Rails 4
但在我的Rails 3項目中,我傳遞一個哈希類級別notify_observers
通話。
self.class.notify_observers :organisation_added_to_group, { group: self, organisation: organisation }
而在觀察者我收到這個哈希:
def organisation_added_to_group(args)
puts args[:group]
puts args[:organisation]
end
我喜歡,我不關心update
的方法內部,如上面的答案。
我的腦子裏最自然的事情是建立一個你會觀察到的「支付」或「交易」模型,因爲觀察對象會讓你訪問關聯的賬戶,收款人和金額, d有爲過去的交易撰寫論文的額外好處。 – 2012-02-23 01:59:25
謝謝,喬丹。你的建議非常有見地,但是由於與編程邏輯無關的原因,我無法在這種情況下做出決定:) – AdamNYC 2012-02-23 02:43:26