2013-10-29 45 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 

和你去那裏,然後它會根據查詢控制器什麼都間隔指定且僅當有變化將它再重裝這一頁。它更多的代碼,然後只是定期重新加載,但用戶會很感激! :)