2012-05-19 3 views
12

私は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内のフィルタはそうではありません。

答えて

25

これは、キャッシングに関する新しい話題を学ぶのに非常に時間をかけています。

あなたは実行するbefore_filtersの後にcaches_action AFTERを呼び出す必要があることが判明しました。私はクラスの最初のものの1つとしてキャッシュのアクションを持っていたので、それ以前のすべてのフィルタはその下にあるので実行されていませんでした。

Pan Thomakoshis answerのおかげで、この宝石の情報が含まれています。これはルビーのドキュメントには含まれていません。私はこの小さな盲点のために失われた時間を刈り取ることができたら、この情報を文書に追加していくつもりです。

関連する問題