2012-10-19 40 views
0

我有一個需要很長時間的操作。我希望能夠在這個過程中提供更新,這樣用戶就不會對他是否失去連接感到困惑。我可以這樣做:在長時間Rails控制器操作期間提供更新

class HeavyLiftingController < ApplicationController 
    def data_mine 
    render_update :js=>"alert('Just starting!')" 
    # do some complicated find etc. 
    render_update :js=>"alert('Found the records!')" 
    # do some processing ... 
    render_update :js=>"alert('Done processig')" 
    # send @results to view 
    end 
end 

回答

0

這樣處理請求是不可能的。對於每個請求,你只有一個答案。

如果你的動作需要很長的時間,那麼也許應該異步執行。您可以在過程中發送用戶電子郵件以通知他進度。

我建議你採取DelayedJob寶石一看: http://rubygems.org/gems/delayed_job

它將處理與assync東西對付你的最困難的部分(序列化/反序列化你的對象,存儲,等等...) 。

希望它可以幫助你!

2

不,您只能在控制器操作中發出一個渲染。在控制器終止之前,渲染器不做任何事情。當data_mine終止時,會有三次呈現,這將導致錯誤。

UPDATE:

你可能必須建立在瀏覽器中一個JavaScript(jQuery的)計時器,然後定期發送AJAX請求到服務器,以確定您的長期運行的任務的當前狀態。

例如,長時間運行的任務可以寫日誌,因爲它的進展,並定期AJAX請求將讀取日誌,並創建某種狀態顯示,並返回到瀏覽器進行顯示。

+0

但是應該有一些做長期任務和發佈更新給用戶的方法嗎?把它分解成更小的動作?但是,在服務器端可以互相調用嗎? – highBandWidth

+0

更新了我的答案 – RadBrad