Railsアクションキャッシングの質問
-
15-10-2019 - |
質問
キャッシュが機能していることを確認する方法はよくわかりませんが、そうではないと確信しています。新しいユーザーが作成されるまでアクションキャッシュするインデックスアクションを備えたユーザーコントローラーがあります。これがコードです:
UsersController < ApplicationController
caches_action :index
def index
@users = User.all
end
def create
expires_action :index
...
end
end
さて、私がアクセスするときの私のログで index
アクション、わかります:
Cached fragment hit: views/localhost:3000/users (0.0ms)
Filter chain halted as [#<ActionController::Filters::AroundFilter:0xe2fbd3 @identifier=nil, @kind=:filter, @options={:only=>#<Set: {"index", "new"}>, :if=>nil, :unless=>nil}, @method=#<Proc:0x186cb11@/Users/bradrobertson/.rvm/gems/jruby-1.5.3/gems/actionpack-2.3.10/lib/action_controller/caching/actions.rb:64>>] did_not_yield.
何がわかりません filter chain halted ... did_not_yield
すべてであり、私もそれを見ます select * from users
...毎回呼び出されていますが、これは私が期待していたものではありません。
誰かがここで何が起こっているのか、なぜこれが私が期待するように振る舞わないのかについて私に啓発することができますか?すなわち。そのアクション全体の出力がキャッシュされたはずだったのに、なぜuser.allが実行されるのですか?
解決
filter chain halted
メッセージとは、アクションが呼び出されないようにする際のフィルターがあることを意味します。これはアクションキャッシュである可能性が高く、実際のアクションが発生しないようにします。それはしませんでした 収率 アクションに、上記のメッセージで示唆されているように、キャッシュ内で何かを見つけたからです。
User.all
それはアクション中であるため、まったく実行されるべきではありませんが、フィルターが実行される前はいつでも実行されます。ページが何らかの形の認証の背後にある場合、認証チェックがSQLコールをトリガーした可能性があります。したがって、SQLログが実際にどこから来たのかを再確認することをお勧めします。
また、期限切れのための適切な構文(少なくともRails Guideによると)は次のとおりです。
expire_action :action => :index
より詳しい情報: Rails Guide