所以我试图找到一种更好的刷新页面的方法。我有一个应用程序,使用您在系统上捕获的数据构建Excel电子表格。所以我所做的只是每10秒重新加载一次页面直到完成,这样才能正常显示通知。
像这样(它是在HAML语法中)
.pending_downloads
- if downloads_policy.pending?
.notification_notice
= image_tag 'spinner.gif'
Your data download is being prepared. This should only take a few minutes. It is safe to leave this page and return later.
= link_to "Cancel download.", download_path(downloads_policy.pending), :method => :delete, :class => "delete_link"
= javascript_tag("ToolkitApplication.periodical_reload();")
periodical_reload();
方法的Ajax(它在coffeescript中)看起来像这样:
class @ToolkitApplication
this.periodical_reload = () ->
setInterval (->
window.location.reload()
), 10000
我认为这种做法可以做得更好。我想让ajax每3秒查询一次模型,看看对象状态何时发生了变化,然后一旦它发生变化,它就会重新加载窗口。因此,在下载准备好之前,你不会重新加载页面10次,每次我尝试重新研究如果可能的话,我得到这个rubyonrails guide,这对于这种边缘情况并不是很有见地。这是可能的,如果有的话,有关于如何做到这一点的任何好的教程/博客文章/建议?谷歌一无所获。
答案 0 :(得分:0)
所以我最终做的很容易。感谢所有帮助。在我的控制器中,我设置了一个private
方法来检查状态
def any_uploads_status_changes?
return true if !Upload.exists?(params[:id])
return true if Upload.find(params[:id]).status
end
然后在名为status的控制器中设置另一个调用:
def status
if any_uploads_status_changes?
render :text => 'window.location.reload();'
else
render :nothing => true
end
end
然后设置一个ajax请求方法(在coffeescript语法中) - >
this.periodically_send_ajax_request = (url, method, interval) ->
setInterval (->
$.ajax
url: url
type: method
success: (result) ->
), interval
然后在视图中使用js:
调用此请求:javascript
ToolkitApplication.periodically_send_ajax_request("#{status_download_path(:id => downloads_policy.pending.id, :class => @model_class).html_safe }",'get', 2000);
确保路径存在于控制器操作
resources :downloads, :only => [:show, :destroy] do
member do
get :status
end
end
然后你去它会根据你指定的间隔查询控制器,只有在有更改时才会重新加载页面。它的代码更多,然后只是定期重新加载,但用户会很感激! :)