我的行动需要很长时间。我希望能够在此过程中提供更新,以便用户不会混淆他是否丢失了连接或其他内容。我可以这样做:
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
答案 0 :(得分:2)
不,您只能在控制器操作中发出一个渲染。在控制器终止之前,渲染无效。当data_mine终止时,将会有三个渲染,这将导致错误。
更新:
您可能需要在浏览器中设置JavaScript(jquery)计时器,然后定期向服务器发送AJAX请求以确定长时间运行任务的当前状态。
例如,长时间运行的任务可以在进行时编写日志,并且定期的AJAX请求将读取该日志并创建某种状态显示,并将其返回给浏览器进行显示。
答案 1 :(得分:0)
以这种方式处理请求是不可能的。对于每个请求,您只有一个答案。
如果您的操作需要很长时间,那么可能应该异步执行。您可以在此过程中发送用户电子邮件,通知他进度。
我建议你看一下DelayedJob gem: http://rubygems.org/gems/delayed_job
它将处理处理assync东西的最困难的部分(序列化/反序列化你的对象,存储,等等......)。
希望它可以帮到你!