私はshowアクションをキャッシュしているコントローラを持っています。 showアクションには、ユーザがログインしていない場合に実行され、リダイレクトされるセキュリティのための多数のbeforeフィルタがあります。現在のグループのメンバーではありません。これらのフィルタは、キャッシュをオンにしていないとき私がスイッチを反転して前のキャッシングをオンにすると、フィルターはもはや実行されません(私のデバッガー呼び出しはヒットしません)。Rails caches_actionがbefore_filtersをスキップしています
キャッシュされたアクションのフィルタが呼び出される前は、これはページキャッシュとアクションキャッシュの主な違いです。フィルタを実行する前にように
アクションのキャッシングは、着信Web要求はRailsのスタックとアクションパックにウェブサーバから行くないという事実を除いてページ・キャッシュのように動作します。これは、読み込みRails Caching Tutorial section on action cachingによってバックアップされていますその上にキャッシュが提供される前に。これにより、キャッシュされたコピーからの出力結果を依然として処理しながら、認証およびその他の制限を実行することができます。
なぜ私の前のフィルターが呼び出されないのですか?
私の設定について:Rails 3.1はDeviseを認証に使用しています。私はmemcachedストアのためにdalli gemを使用しています。ここで
は私のコードをまとめたいくつかのコード(嫌なものの多くを切り出し)である:だから
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がありますか?
[EDIT]
は、興味深いことに、私はちょうど戻り値は、さらにチェーンに沿って実行されているかどうかの方法に影響を与えていないことを学んだ、それは、リダイレクトやレンダリングが呼び出されているかどうかです。[編集2]
私はそれが効果があったかどうかを確認するために3.2.3をレールに私のアプリをアップグレードしたが、問題を解決しませんでした。私が発見したことは、ApplicationControllerで定義されたbeforeフィルタが呼び出されていることですが、私のGroupsController内のフィルタはそうではありません。