2012-05-19 82 views
12

我有一個控制器,我正在緩存show操作。 show action中有一些過濾前的安全性過濾器,如果用戶沒有登錄,而不是當前組的成員,那麼這些過濾器會執行並重定向。當我沒有打開緩存時,這些過濾器工作正常,但當我翻轉開關以關閉緩存之前,過濾器不再執行(我的調試器調用未命中)。Rails caches_action正在跳過before_filters

一直以來我的理解是,在調用緩存操作的過濾器之前,這是頁面緩存和操作緩存之間的主要區別。

動作緩存就像頁面緩存,除了一個事實,即傳入Web請求並從網絡服務器到Rails的堆棧和行動寶盒去,這樣的過濾器才能運行:這是由Rails Caching Tutorial section on action caching讀取備份在緩存服務之前就可以了。這允許運行身份驗證和其他限制,同時仍提供緩存副本的輸出結果。

那麼,爲什麼我之前沒有過濾器被調用?

有關我的設置:Rails 3.1使用Devise進行身份驗證。我正在使用dalli gem作爲memcached商店。

下面是一些代碼,總結我的代碼(很多克魯夫特的切出):

class GroupsController < ApplicationController 
    caches_action :show 
    cache_sweeper :group_sweeper 

    before_filter :authenticate_user!, :except => [:index] 
    before_filter :init_group, :except => [:new, :create, :index] 
    before_filter :requires_group_membership, :except => [:new, :create, :index] 

    def show 
    end 

    private 

    def requires_group_membership 
    if current_user and [email protected]_active.index(current_user).nil? 
     return true 
    else 
     redirect_to :root 
     return false 
    end 
    end 

    def init_group 
    @group = current_user.active_groups.find_by_id(params[:id]) 

    if @group.nil? 
     redirect_to :root 
     return false 
    end 
    end 

那麼,有沒有人見過這種行爲?我在理解過濾器和動作緩存應該如何工作之前有沒有漏洞?或者,也許我有一些奇怪的混亂的寶石版本發生的voodo?

[編輯]

有趣的是我剛剛獲悉,返回值還沒有對是否沒有方法的進一步沿着鏈的運行產生影響,這是一個重定向或渲染是否被調用。

[編輯2]

我升級我的應用程序導軌3.2.3,看它是否有效果,但並沒有解決問題。我發現的一點是,ApplicationController中定義的前面的過濾器正在調用,但我的GroupsController中的過濾器沒有。

回答

25

那麼這是一個非常耗時的方式來學習關於緩存的新消息。

事實證明,您必須在要運行的before_filters之後調用caches_action AFTER。我把緩存行爲作爲我的課堂中的第一件事,所以之前的所有過濾器都沒有運行,因爲它們在下面。

感謝Pan Thomakos對於his answer包含此寶石的信息 - 這是不是在紅寶石文檔或我已經掠過它。一旦我設法彌補由於這個小盲點造成的時間損失,我會努力將這些信息添加到文檔中。