0

我有一个需要很长时间的操作。我希望能够在此过程中提供更新,这样用户就不会因为失去连接或其他原因而感到困惑。我可以做这样的事情:

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
4

2 回答 2

2

不,您只能在控制器操作中发出 ONE 渲染。在控制器终止之前,渲染什么都不做。当 data_mine 终止时,会有 3 次渲染,这将导致错误。

更新:

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

例如,长时间运行的任务可以在执行过程中写入日志,周期性的 AJAX 请求会读取该日志并创建某种状态显示,然后将其返回给浏览器进行显示。

于 2012-10-19T16:58:32.230 回答
0

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

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

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

它将为您处理处理异步内容的最困难部分(序列化/反序列化您的对象、存储等......)。

希望对你有帮助!

于 2012-10-19T19:10:46.117 回答