2012-02-24 39 views
17

我正在使用Ruby on Rails 3.1,並且我想知道(對於性能原因)after_filter是否在該視圖文件呈現後運行。也就是說,當用戶訪問我的應用程序URL時,他/她應該顯示的相關視圖文件在after_filter運行或after_filter運行之前就會呈現視圖文件?'after_filter'如何/何時運行?

換句話說應用服務器開始渲染視圖數據發送到用戶之前運行after_filter或它等待運行after_filter方法,然後纔將其發送該視圖的數據?

P.S.:我打開這個問題是因爲我想運行一些系統更新(注意:這些更新不會影響視圖輸出數據,並且不會被「/」用於「視圖所必需的」),而不會影響到最終用戶體驗(例如:緩慢加載我的應用程序網頁)。

回答

11

您必須意識到,對您的服務器的請求是完全一致的,並在其自己的線程中運行。

如果您將代碼放在after_filter中,這會延遲整個請求:總結不好,如果線程處於活動狀態,則不會傳遞頁面。

這就是爲什麼你會發現很棒的插件,如DelayedJobResque,它們在並行進程中工作,不會影響你的應用程序。


要回答您的原始問題,請在視圖處理後觸發after_filter

這有時是件麻煩事,這就是爲什麼已經產生了內容之後people created some before_render filters.

5

after_filter運行,但在此之前它被髮送到客戶端。您可以驗證這是因爲您可以在任何after_filter中訪問控制器的response方法中完全生成的響應數據。

After_filters是不適合放置長時間運行的任務的地方,因爲它們肯定會影響用戶的體驗。請考慮使用after_filter啓動長時間運行的delayed_jobresque任務,以改爲執行後臺工作。