在模型回调的Rails控制器中触发操作

Cim*_*imm 5 event-bus server-sent-events ruby-on-rails-4

我试图围绕Rails中的服务器发送事件进行直播.我有一个Rake任务侦听文件更改,这会将记录添加到数据库中.一旦添加,我想发送一个SSE到前端.

但是,模型不能向前端发送事件,控制器负责.如何告诉我的控制器将新记录添加到数据库中?

到目前为止我的(破碎)解决方案:在模型中使用带有回调的EventBus,after_save它会通知更改并要求控制器监听这些消息:

require 'reloader/sse'
class SseController < ApplicationController
  include ActionController::Live

  def index
    response.headers['Content-Type'] = 'text/event-stream'
    sse = Reloader::SSE.new(response.stream)
    EventBus.subscribe(:added) do |payload|
      sse.write({ /* payload */ })
    end
  rescue IOError
  ensure
    sse.close
  end
end
Run Code Online (Sandbox Code Playgroud)

我认为我的请求在收到事件之前就结束了,这意味着它永远不会在de subscribe块中结束.这是正确的方法,如果是这样,我错过了什么?

udi*_*tal 1

解决方案 1:您可以使用 rest_client gem 在模型的 after_save 回调中向控制器发送请求。

解决方案 2:为什么不在控制器中调用模型方法来创建数据库记录,然后根据是否创建记录来处理进一步的操作