如何强制完成控制器动作的响应?

时间:2013-01-28 23:06:46

标签: ruby-on-rails ruby actioncontroller

我需要对控制器动作进行一些慢速操作。但是没有必要等待此操作进行响应呈现。

class ProductController < ActionController
  def update
    slow_operations()
    render json: {status: 'ok'}
  end
end

即使我在产品#更新操作中render之后移动我的代码,也不会缩短响应时间。

class ProductController < ActionController
  def update
    render json: {status: 'ok'}
    slow_operations()
  end
end

如何在执行慢速操作之前强制返回完整响应?

2 个答案:

答案 0 :(得分:3)

由于Rails的工作方式,它仍然会在动作完成后进行实际的“渲染” - 因此,正如您所发现的那样,在您的动作中移动“渲染”并没有帮助。您需要做的是将长时间运行的操作拖入后台进程。有很多宝石可以做到这一点,包括BackgroundRbDelayed JobSidekiq(我个人最喜欢的,主要是因为它是多线程的,减少了你需要启动的进程数量) ,以及它漂亮的基于Web的管理/监控界面)。

甚至还有一个Railscast让你开始大部分这样的活动,比如这个:http://railscasts.com/episodes/366-sidekiq

答案 1 :(得分:1)

您需要集成ResqueGirl Friday之类的内容,以便将缓慢的流程卸载到后台任务。