Rails Caches_actionは前のファイルをスキップしています
-
11-12-2019 - |
質問
私は私がショーアクションをキャッシュしているコントローラを持っています。 showアクションは、キャッシングをオンにしていないときに、現在のグループなどのメンバーではなく、ユーザーが現在のグループなどのメンバーではなくログインしていない場合は、セキュリティのためのフィルタがいくつかあります。スイッチをフリップすると、より前のフィルタのキャッシュをオンにして実行されなくなります(私のデバッガコールはヒットしません)。
キャッシュされたアクションのためにフィルタが呼び出される前に、これがページキャッシュとアクションキャッシングの間の主な違いです。これは Rails Caching Tutorialセクションで述べています。
アクションキャッシュは、着信Web要求がWebサーバからRails StackおよびAction Packに移動していることを除いて、ページキャッシュのように機能します。これにより、キャッシュが提供される前にフィルタを実行する前にこれにより、キャッシュされたコピーからの出力の結果をまだ処理しながら、認証やその他の制限を実行できます。
だからフィルタが呼ばれる前に私の前になぜじゃないのですか?
ビットABE MY SETUP:認証のためのデーショナを使用してレール3.1。私はMemcached StoreにDalli GEMを使用しています。
これは私のコードを要約するいくつかのコードです(たくさんのCruftを切り取る):
.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で定義されているフィルタが呼び出される前のものですが、私のGroupsControllerのものはそうではありません。
解決
井戸これは、キャッシングに関する新しいTIDBITを学ぶための非常に時間がかかりられています。
実行したい前の前の後にcaches_action の呼び出しをする必要があることがわかります。私は私のクラスの最初のものの1つとしてキャッシュアクションを置いた。これは、CACHES_Actionの後/後/後に表示されているすべてのフィルタが実行されていないことを意味し、CACHES_Actionはコードの実行を停止します(およびキャッシュ結果を処理します)。
Pan Thomakos for 彼の答えこの宝石を含んでいた情報 - Ruby Docsではなく、またはそれをスキム化しました。この情報がこの小さな目隠しスポットのために失われた時間を閉じ込めたら、この情報をドキュメントに追加するように永続させます。