我不太确定如何确保我的缓存有效,但我很确定它不是。我有一个带有索引操作的用户控制器,我在操作缓存,直到创建新用户。这是代码:
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会运行?
答案 0 :(得分:6)
filter chain halted
消息表示有一个around过滤器可以停止调用该操作。这很可能是动作缓存,可以阻止实际操作的发生。它没有产生到该操作,因为它在缓存中找到了一些内容,如上面的消息所示。
User.all
根本不应该运行,因为它在操作中,但任何过滤器之前都会运行。如果您的页面支持某种形式的身份验证,那么身份验证检查可能会触发SQL调用。因此,您可能需要仔细检查SQL日志的真正来源。
此外,到期的正确语法(至少根据rails指南)是:
expire_action :action => :index
更多信息:Rails Guide