1

キャッシュが機能していることを確認する方法はよくわかりませんが、そうではないことは確かです。新しいユーザーが作成されるまでアクションをキャッシュするインデックス アクションを持つユーザー コントローラーがあります。コードは次のとおりです。

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 が実行されるのでしょうか?

4

1 に答える 1

6

このfilter chain haltedメッセージは、アクションの呼び出しを停止するアラウンド フィルターがあることを意味します。これは、実際のアクションの発生を停止するアクション キャッシュである可能性があります。上記のメッセージで示唆されているように、キャッシュ内に何かが見つかったため、アクションに屈しませんでした。

User.allアクション内にあるため、まったく実行しないでください。ただし、前のフィルターはすべて実行されます。ページがなんらかの形式の認証の背後にある場合、認証チェックによって SQL 呼び出しがトリガーされた可能性があります。そのため、SQL ログが実際にどこから来ているのかを再確認することをお勧めします。

また、期限切れの適切な構文 (少なくとも Rails ガイドによると) は次のとおりです。

expire_action :action => :index

詳細: Rails ガイド

于 2011-01-04T22:25:38.943 に答える