在Rails应用程序上更新服务器端进度

时间:2020-03-06 14:35:27  来源:igfitidea点击:

我想上传然后在Ruby on Rails应用程序中处理文件。文件上传通常很短,但是服务器端处理可能要花一些时间(超过20秒),因此我想给用户一些指示,而不是无意义的"处理..."屏幕。

我正在尝试在视图中使用以下代码

<%= periodically_call_remote(:url => {:action => 'progress_monitor', :controller => 'files'},
                 :frequency => '5',
                 :update => "setProgress('progressBar','5')"
                 ) %>

:update参数的内容是我想每5秒运行一次的javascript

并且以下代码在文件控制器中

def progress_monitor
  render :text => 'whatever'
end

最终,progress_monitor方法将以整数(已完成百分比)的形式返回当前进度,并将其传递到" setProgress" javascript代码中(将更新屏幕上的元素)

但是,我正在努力从服务器获取正确的响应,然后可以将其传递给javascript。

任何人都可以提供帮助,还是我以错误的方式处理此问题?

对此有一个后续问题,我最初更新了此问题,但此更新与此处有足够不同,可以提出一个新问题。

解决方案

Periodic_call_remote()更新一个div。它不会调用javascript函数。我不是javascript专家,但是要解决问题,我们应该执行自己的xmlhttp调用。如果我是你,我将使用prototype的ajax请求

http://www.prototypejs.org/api/ajax/request

并使用javascript的settimeout或者setinterval进行定期轮询

http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/

希望这可以帮助cos实际上我也遇到过相同的prb =)

:update选项应该只列出要更新的div,而没有要评估的Javascript。

在这种情况下,Rails帮助器仍然非常有用,无需编写很多自定义JS。如果我们希望在返回时执行JS,一种简单的方法是呈现RJS模板。如果我们希望使用纯HTML做到这一点,只需渲染视图(或者部分视图,或者直接从带有进度条HTML的render方法返回),然后将进度条的div放在:update选项中'periodically_call_remote`方法的功能。