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

javascript ruby-on-rails ajax xmlhttprequest

1734 观看

2回复

1563 作者的声誉

我想上传然后在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。

任何人都可以帮忙,还是我接近这个错误的方式?

对此有一个跟进问题,我最初更新了这个问题,但更新有很大不同,需要在这里提出一个新问题。

作者: Matt Haughton 的来源 发布者: 2008 年 9 月 23 日

回应 (2)


2

4931 作者的声誉

决定

periodically_call_remote()更新了div。它不会调用您的JavaScript函数。我不是JavaScript大师,但为了解决你的问题,你应该自己做一个xmlhttp电话。如果我是你,我会使用原型的AJAX请求

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

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

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

希望这有助于实际上我也遇到了相同的prb =)

作者: liangzan 发布者: 23.09.2008 10:56

0

8320 作者的声誉

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

Rails助手仍然非常适合这种情况,没有必要编写太多的自定义JS。如果您希望在返回时执行JS,一种简单的方法是呈现RJS模板。如果您希望使用纯HTML执行此操作,只需渲染视图(或部分,或render使用进度条的HTML 直接从方法返回),并将进度条的div放在方法的:update选项中periodically_call_remote

作者: Ian Terrell 发布者: 23.09.2008 02:06
32x32