我试图将Wisper与Rails 4 / AR一起使用并遇到问题。
我们说我有Email
和Creep
AR模型,我希望Creep
知道何时收到回复(Creep
不一定发件人......)
所以我这样做:
email = Email.create! params
creep = Creep.last
email.subscribe(creep, on: :reply_received, with: :success)
如果立即执行:
email.publish :reply_received
它将起作用(Creep
实例有成功方法。)
但是,如果我以后再做:
email = Email.find(id)
或:
email = Email.last
该活动未播出。我猜这是因为新电子邮件是一个不同的实例,因此没有订阅听众。我做错了什么?
答案 0 :(得分:1)
你是对的。使用email.subscribe
您正在将侦听器订阅到单个对象。执行Email.find
后,您将获得另一个email
对象(请检查email.object_id
)。
您可以为新返回的对象订阅creep
:
email = Email.find(id)
email.subscribe(Creep.last)
或者您可以creep
订阅Email
这样的所有实例:
Email.subscribe(Creep.last)
您可能会想要在初始化程序中执行上述操作,因此只会发生一次。
然而,这可能是一个问题,因为您似乎想要订阅Creep.last
,这将随着时间的推移而改变。在这种情况下,你可以做一些像这样的事情:
class CreepListener
def success(*args)
Creep.last.success(*args)
end
end
Email.subscribe(CreepListener.new)