2015-06-24 25 views
0

我想用Rails 4/AR使用Wisper並遇到問題。如何將Wisper與同一個活動記錄模型的不同實例一起使用?

比方說,我有EmailCreep AR模型,我想,當接收到一個答覆Creep知道(Creep不一定是發送者...)

所以我做的:

email = Email.create! params 
creep = Creep.last 
email.subscribe(creep, on: :reply_received, with: :success) 

如果馬上做:

email.publish :reply_received 

它將工作(Creep實例甲肝e成功的方法)。

但是,如果我以後做:

email = Email.find(id) 

或:不播

email = Email.last 

事件。我猜這是因爲新的電子郵件是一個不同的實例,因此沒有訂閱的聽衆。我究竟做錯了什麼?

回答

1

你是對的。使用email.subscribe您正在將偵聽器訂閱到單個對象。當你做Email.find時,你會得到一個不同的email對象(檢查email.object_id)。

您可以訂閱creep到新返回的對象:

email = Email.find(id) 
email.subscribe(Creep.last) 

或者你可以訂閱creep像這樣的Email所有實例:

Email.subscribe(Creep.last) 

你proberbly想做的以上在初始化器中,所以它只發生一次。

但是,這可能是一個問題,因爲它似乎你想訂閱Creep.last這將改變隨着時間的推移。在這種情況下,你可以做一些像這樣的事情:

class CreepListener 
    def success(*args) 
    Creep.last.success(*args) 
    end 
end 

Email.subscribe(CreepListener.new) 
+0

謝謝。我目前正在使用類似後者的建議(訂閱所有電子郵件,併爲每封電子郵件尋找正確的蠕變)。前者的解決方案違反了電子郵件/蠕變代碼的解耦目標(以及韋斯珀在我眼中的巨大優勢之一)。 /如果我們希望同一模型ID的所有實例都被認爲是相同的,那麼您是否看到了爲AR對象訂閱不同工作的好處?也許是一個發佈者類的方法,它允許用戶覆蓋實例在訂閱上存儲/呈現的方式?如果是這樣,我很樂意提供幫助。 – delight

+0

如果你想在Github上打開一個問題的代碼示例,我會很樂意討論這個問題。我以前沒有遇到過這個問題。 – Kris

相關問題