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

时间:2014-07-01 11:58:07

标签: ruby-on-rails-4 server-sent-events event-bus

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

但是,模型无法向前端发送事件,控制器对此负责。如何告诉我的控制器将新记录添加到数据库?

到目前为止我的(破碎)解决方案:在模型中使用EventBusafter_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

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

1 个答案:

答案 0 :(得分:1)

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

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