Rails Ajax在重新加载页面之前查询数据

时间:2013-10-29 06:52:54

标签: ruby-on-rails ajax coffeescript

所以我试图找到一种更好的刷新页面的方法。我有一个应用程序,使用您在系统上捕获的数据构建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,这对于这种边缘情况并不是很有见地。这是可能的,如果有的话,有关于如何做到这一点的任何好的教程/博客文章/建议?谷歌一无所获。

1 个答案:

答案 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

然后你去它会根据你指定的间隔查询控制器,只有在有更改时才会重新加载页面。它的代码更多,然后只是定期重新加载,但用户会很感激! :)