我有一個控制器,我正在緩存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中的過濾器沒有。