2011-09-01 35 views
1

這是Rails 2.3.10和Ruby 1.8。Rails 2.3:在執行after_filter之前立即重定向

我有一些代碼,看起來大致是這樣的:

class RedirectingController 
    after_filter :do_something_long, :only => [:show] 
    def show 
    redirect_to "http://www.google.com" 
    end 

    def do_something_long 
    sleep 60 
    logger.debug("Something long has completed") 
    end 
end 

現在我的問題是,即使我在重定向已被執行的日誌中看到,它等待,直到睡眠60前完成重定向實際上發生了。有沒有辦法讓重定向發送到瀏覽器,然後運行do_something_long。作爲一個附註,我試圖避免使用諸如delayed_job或resque之類的東西。

回答

0

類似於delayed_job或resque的設計旨在啓動並完成長時間運行的後臺任務,而不是讓用戶等待它完成(並凍結ui)。這項任務需要多長時間?如果它以毫秒爲單位完成,那麼大多數人可能都不會注意到,但如果花費的時間比您需要的時間長,則應該深入研究delayed_job。你有一個令人信服的理由或掛斷,爲什麼你不能?

+0

我給一些背景:這是被擊中會通過一個非常大的用戶量被擊中的動作。所有的動作都是重定向(想一想粗略的比喻),但是有一些計算需要發生,我不想增加重定向的時間,最多隻需要0.5s。 – Mike

+0

好的。是否有一個令人信服的理由,您可以使用延遲工作?這似乎是一個相當不錯的用例。他們開始行動,你開始耽誤工作,而且他們快速閃電。 – Msencenb

+0

如果我不得不使用delayed_job,我會這樣做,但是與僅刷新輸出,重定向瀏覽器,然後執行計算相比,這看起來會有很大的開銷。我也擔心數據庫中寫入delayed_job的數據量會在數據庫中創建可能會影響網站的其他部分。 – Mike

0

你可以做這樣的事情:

def do_something_long 
    Thread.new do 
    sleep 60 
    logger.debug("Something long has completed") 
    end 
end 

How to run a very small amount of code asynchronously?

+0

我試着做一個thread.new塊來做計算,但我得到一個零對象異常,而在單線程模式下它沒有問題。在控制器操作中使用線程是否存在已知問題? – Mike