在长Rails控制器操作期间提供更新

时间:2012-10-19 16:51:02

标签: ruby-on-rails model-view-controller

我的行动需要很长时间。我希望能够在此过程中提供更新,以便用户不会混淆他是否丢失了连接或其他内容。我可以这样做:

class HeavyLiftingController < ApplicationController
  def data_mine
    render_update :js=>"alert('Just starting!')"
    # do some complicated find etc.
    render_update :js=>"alert('Found the records!')"
    # do some processing ...
    render_update :js=>"alert('Done processig')"
    # send @results to view
  end
end

2 个答案:

答案 0 :(得分:2)

不,您只能在控制器操作中发出一个渲染。在控制器终止之前,渲染无效。当data_mine终止时,将会有三个渲染,这将导致错误。

更新:

您可能需要在浏览器中设置JavaScript(jquery)计时器,然后定期向服务器发送AJAX请求以确定长时间运行任务的当前状态。

例如,长时间运行的任务可以在进行时编写日志,并且定期的AJAX请求将读取该日志并创建某种状态显示,并将其返回给浏览器进行显示。

答案 1 :(得分:0)

以这种方式处理请求是不可能的。对于每个请求,您只有一个答案。

如果您的操作需要很长时间,那么可能应该异步执行。您可以在此过程中发送用户电子邮件,通知他进度。

我建议你看一下DelayedJob gem: http://rubygems.org/gems/delayed_job

它将处理处理assync东西的最困难的部分(序列化/反序列化你的对象,存储,等等......)。

希望它可以帮到你!