2012-02-23 87 views
4

我在帳戶模型中有幾種方法:支付,接收,退款等,以便我需要AccountObserver觀看。但我想傳遞額外的對象到我的AccountObserver。將額外參數傳遞給Rails觀察者

例如,在我的帳戶模式,我想定義:

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

end 

我應該怎樣做呢?

謝謝。

+0

我的腦子裏最自然的事情是建立一個你會觀察到的「支付」或「交易」模型,因爲觀察對象會讓你訪問關聯的賬戶,收款人和金額, d有爲過去的交易撰寫論文的額外好處。 – 2012-02-23 01:59:25

+0

謝謝,喬丹。你的建議非常有見地,但是由於與編程邏輯無關的原因,我無法在這種情況下做出決定:) – AdamNYC 2012-02-23 02:43:26

回答

2

恐怕這對於觀察者來說不是一個很好的用例。我能想到的最好的辦法,沒有完全準備不同的路線,就是你的帳戶的對象,然後可以在觀察訪問,例如:

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 
+0

謝謝,喬丹。我查看了源代碼,並意識到我必須重寫notify_observers才能執行我想要的操作。 – AdamNYC 2012-02-23 22:39:46

7

不要覆蓋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) 
+0

這太好了,FX!非常感謝。 – AdamNYC 2012-05-12 17:00:11

+0

感謝您的支持!我發現我需要自己調用類級別的notify_observers,但仍然無法工作。這幫助我瞭解到我需要修改觀察者本身的'update'實例方法。 – 2013-02-17 20:53:27

1

遲到的反應,但我希望有人會發現它有幫助。

首先,它似乎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的方法內部,如上面的答案。

相關問題