2013-10-29 48 views
0

所以我想找到刷新页面的更好方法。我有一个应用程序,它使用您在系统上捕获的数据构建Excel电子表格。所以我所做的只是每10秒钟重新加载一次页面直到完成,这样通知才能正常显示。Rails重新加载页面之前的Ajax查询数据

像这样的东西(它在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();") 

阿贾克斯(它在CoffeeScript中)为periodical_reload();方法是这样的:

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

这种做法我觉得可以做更好。我想让ajax每3秒查询一次模型,以查看对象状态何时发生变化,然后一旦发生变化,就会重新加载窗口。所以,在下载准备就绪之前,你不会像下载10次那样重新加载页面,每次我尝试研究时,如果这是可能的,我会得到这个rubyonrails guide,这对于这种边缘情况来说确实非常有见地。这是可能的,如果有的话,是否有任何好的教程/博客文章/建议如何做到这一点?谷歌没有屈服。

+3

定期重新加载是你甚至不应该想到在任何应用程序中使用的东西。它混淆了用户和呈现应用程序不专业(至少恕我直言)。你应该'setInterval'来检查服务器是否准备好数据。如果准备就绪并且用户处于同一页面,则只需更新显示结果的视图块即可。或者在成功完成任务后,显示弹出式或类似Linux的警报,通知用户该任务已完成。另外,当时不要忘记'clearInterval'。在警报中,提供一个链接让用户参与。 –

+0

是啊,这是我正在看做页面将不得不刷新,因为有表将刷新以及。但我100%同意。捕捉我的部分使用ajax来查询服务器数据。我正在使用respond_to | format |然后format.js尝试捕获它,但这是令人困惑的 – TheLegend

回答

0

所以我最终做的很容易。感谢所有帮助。在我的控制器我设置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的语法) - >

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 

和你去那里,然后它会根据查询控制器什么都间隔指定且仅当有变化将它再重装这一页。它更多的代码,然后只是定期重新加载,但用户会很感激! :)