0

我正在尝试将 Wisper 与 Rails 4 / AR 一起使用并遇到问题。

假设我有EmailARCreep模型,我想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

该事件不广播。我猜这是因为新电子邮件是一个不同的实例,因此没有订阅的听众。我究竟做错了什么?

4

1 回答 1

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)
于 2015-06-25T13:26:44.737 回答