Wisper:在请求之间取消订阅 GlobalListeners
Wisper: unsubscribing GlobalListeners between requests
我想在我的 ApplicationController 中注册一个全局侦听器,它包含 current_user。我最终尝试了这个:
class ApplicationController < ActionController::Base
before_action do
@listener = MyListener.new(current_user)
Wisper.clear if Rails.env.development?
Wisper.subscribe(@listener, scope: :MyPublisher)
end
end
但是,当我将此代码部署到 heroku 时,这些全局侦听器永远不会取消订阅,并且该应用程序会通过请求不断积累侦听器。
我不能依赖 after_action,因为应用程序可能会因错误而终止。怎样做才是正确的,是不是订阅前强行清空,像这样?
class ApplicationController < ActionController::Base
before_action do
@listener = MyListener.new(current_user)
Wisper.clear
Wisper.subscribe(@listener, scope: :MyPublisher)
end
end
在另一个 中,Kris 建议我们应该使用订阅一次的初始化程序。我不这样做的原因是因为我想访问 current_user,并且我不想通过全局 variables/Thread.current 传递它。让 GlobalListeners 与 current_user 一起工作的最佳方法是什么?
我的用例是在 all 控制器操作中处理 current_user 加载的 ActiveRecord 模型的 all 实例。 Wisper 完全 我需要它做的事情,除了提到的问题。
class MyPublisher < ActiveRecord::Base
include Wisper::Publisher
after_find { broadcast(:process_find, self) }
end
对于听众:
class MyListener
def initialize(current_user)
@current_user = current_user
end
def process_find
...
end
end
您可以订阅您的听众globally for the duration of a block:
def show
Wisper.subscribe(MyListener.new(current_user)) do
@model = MyPublisher.find(id)
end
end
当块结束时,监听器将被取消订阅。
如果您希望它发生在多个操作中,您可以使用 around_action
过滤器:
around_action :subscribe_listener
def show
@model = MyPublisher.find(id)
end
def create
# ...
end
# etc.
private
def subscribe_listener
Wisper.subscribe(MyListener.new(current_user)) do
yield
end
end
我想在我的 ApplicationController 中注册一个全局侦听器,它包含 current_user。我最终尝试了这个:
class ApplicationController < ActionController::Base
before_action do
@listener = MyListener.new(current_user)
Wisper.clear if Rails.env.development?
Wisper.subscribe(@listener, scope: :MyPublisher)
end
end
但是,当我将此代码部署到 heroku 时,这些全局侦听器永远不会取消订阅,并且该应用程序会通过请求不断积累侦听器。 我不能依赖 after_action,因为应用程序可能会因错误而终止。怎样做才是正确的,是不是订阅前强行清空,像这样?
class ApplicationController < ActionController::Base
before_action do
@listener = MyListener.new(current_user)
Wisper.clear
Wisper.subscribe(@listener, scope: :MyPublisher)
end
end
在另一个
我的用例是在 all 控制器操作中处理 current_user 加载的 ActiveRecord 模型的 all 实例。 Wisper 完全 我需要它做的事情,除了提到的问题。
class MyPublisher < ActiveRecord::Base
include Wisper::Publisher
after_find { broadcast(:process_find, self) }
end
对于听众:
class MyListener
def initialize(current_user)
@current_user = current_user
end
def process_find
...
end
end
您可以订阅您的听众globally for the duration of a block:
def show
Wisper.subscribe(MyListener.new(current_user)) do
@model = MyPublisher.find(id)
end
end
当块结束时,监听器将被取消订阅。
如果您希望它发生在多个操作中,您可以使用 around_action
过滤器:
around_action :subscribe_listener
def show
@model = MyPublisher.find(id)
end
def create
# ...
end
# etc.
private
def subscribe_listener
Wisper.subscribe(MyListener.new(current_user)) do
yield
end
end