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

Ruby on rails Rails Ajax在重新加载页面之前查询数据,ruby-on-rails,ajax,coffeescript,Ruby On Rails,Ajax,Coffeescript,因此,我试图找到一个更好的方式刷新页面。我有一个应用程序,它使用您在系统上捕获的数据构建Excel电子表格。所以我让它做的只是每10秒重新加载一次页面,直到它完成,这样通知就可以正确显示 类似于这样的内容(使用HAML语法) 用于定期加载()的Ajax(在coffeescript中)方法如下所示: class @ToolkitApplication this.periodical_reload = () -> setInterval (-> window.lo

因此,我试图找到一个更好的方式刷新页面。我有一个应用程序,它使用您在系统上捕获的数据构建Excel电子表格。所以我让它做的只是每10秒重新加载一次页面,直到它完成,这样通知就可以正确显示

类似于这样的内容(使用HAML语法)

用于
定期加载()的Ajax(在coffeescript中)方法如下所示:

class @ToolkitApplication
  this.periodical_reload = () ->
    setInterval (->
      window.location.reload()
    ), 10000

我认为这种方法可以做得更好。我希望ajax每3秒钟查询一次模型,查看对象状态何时发生变化,一旦发生变化,它将重新加载窗口。因此,在下载准备好之前,你不会让页面重新加载10次,每次我尝试重新搜索,如果可能的话,我都会得到这样的结果,这对于这种边缘案例来说不是很有见地。这可能吗?如果可能的话,有没有关于如何做到这一点的好教程/博客帖子/建议?谷歌一无所获。

所以我最终做的很简单。多亏了这些帮助。在我的控制器中,我设置了一个
private
方法来检查状态

def any_uploads_status_changes?
  return true if !Upload.exists?(params[:id])
  return true if Upload.find(params[:id]).status
end
然后在控制器中设置另一个名为“状态”的调用:

def status
  if any_uploads_status_changes?
    render :text => 'window.location.reload();'
  else
    render :nothing => true
  end
end
然后设置一个ajax请求方法(用coffeescript语法)->

然后在使用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

然后,它将根据您指定的时间间隔查询控制器,只有在发生更改时,它才会重新加载页面。它的代码比定期重新加载要多一点,但用户会很感激的!)

定期重新加载是您甚至不应该考虑在任何形式的应用程序中使用的东西。它会混淆用户并使应用程序不专业(至少是IMHO)。您应该
setInterval
在服务器上检查数据是否准备就绪。如果已经准备好并且用户位于同一页面,则只需更新显示结果的视图块。或者在任务成功完成后,显示弹出窗口或类似Linux的警报,通知用户所述任务已完成。另外,不要忘记在那时清除间隔。在警报中,提供一个链接,将用户带到结果。是的,这就是我正在看的,页面将必须刷新,因为有一个表也将刷新。但我百分之百同意。吸引我的部分是使用ajax查询服务器数据。我正在使用respond_to | format |然后使用format.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