show アクションをキャッシュしているコントローラーがあります。show アクションには、ユーザーがログインしていない場合や現在のグループのメンバーではない場合などに実行およびリダイレクトすることを目的とした、セキュリティのための多数の before フィルターがあります。これらの before フィルターは、キャッシュをオンにしていない場合に完全に機能しますが、フィルターが実行されなくなる前に、スイッチを切り替えてキャッシュをオンにすると (私のデバッガー呼び出しはヒットしません)。
フィルターがキャッシュされたアクションに対して呼び出される前に、これがページ キャッシングとアクション キャッシングの主な違いであることを常に理解しています。これは、アクションキャッシングに関する Rails Caching Tutorial セクションによって裏付けられています。
アクション キャッシングはページ キャッシングと同じように機能しますが、受信した Web リクエストが Web サーバーから Rails スタックとアクション パックに送られ、キャッシュが提供される前にフィルターを実行できるという点が異なります。これにより、キャッシュされたコピーからの出力結果を提供しながら、認証やその他の制限を実行できます。
では、なぜ私の before フィルターが呼び出されないのでしょうか?
私のセットアップについて少し: 認証にDeviseを使用するRails 3.1。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 !@group.users_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
それで、誰かが前にこの行動を見たことがありますか?フィルタとアクション キャッシングがどのように機能するかについて、私の理解に穴がありますか? それとも、宝石バージョンの奇妙な組み合わせで奇妙なブードゥーが起こっているのでしょうか?
[編集]
興味深いことに、戻り値は、チェーンに沿ってさらにメソッドが実行されるかどうかに影響を与えないことを知りました。それは、リダイレクトまたはレンダリングが呼び出されるかどうかです。
[編集2]
アプリを rails 3.2.3 にアップグレードして効果があるかどうかを確認しましたが、問題は解決しませんでした。私が発見したことは、ApplicationController で定義された before フィルターが呼び出されているが、GroupsController のものは呼び出されていないことです。