从控制器动态更改视图 - 在Rails中使用线程进度条

Gar*_*eld 1 multithreading ruby-on-rails render progress-bar

我有时间在我的控制器中执行任务,我想在我的视图中触发一个简单的进度条/进度状态.

在我的控制器中我有类似的东西

threads = []
total.times do |x|
    Thread.new {
        the_time_taking_task(x)
        #Something here to trigger the progressbar in the view
    }
end

threads.each { |aThread|  aThread.join }
render :action => 'some_action'    
Run Code Online (Sandbox Code Playgroud)

我不能在那里放一个渲染,因为它会抛出一个双渲染错误.我尝试放一个渲染并返回那里,我得到了return can't jump across threads'错误

我正在尝试渲染,因为它似乎是我的控制器可以查看的唯一方式.我的方法有误吗?

想要通过该调用应用进度条宽度的视图中需要这样简单的东西

<div style="width: <%= (percent_val)%>px; ">
Run Code Online (Sandbox Code Playgroud)

请指教.

shi*_*ara 6

是的,这是一个错误的方法.

Web是无状态的,您无法阻止进程呈现视图并通过另一个请求获取它.

好方法是:

1)生成队列任务而不是你的线程.您可以使用delayed_job,resque或queue系统,如rabbitMQ或beanstalkD

2)添加一个控制器来检查队列中的进程是否结束以及进度如何.在里面,你输入队列ID并检查是否结束并返回进度百分比.

最简单的方法是通过Ajax做到这一点.