ruby-on-railscachingaction-caching

Rails action caching question


I'm not quite sure how to ensure my caching is working, but I'm pretty sure it's not. I have a users controller with an index action that I'm action caching until a new user is created. Here's the code:

UsersController < ApplicationController
  caches_action :index
  def index
    @users = User.all
  end

  def create
    expires_action :index
    ...
  end
end

Now, in my logs when I access the index action, I see:

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.

I'm not sure what the filter chain halted ... did_not_yield is all about and I also see that that select * from users... is getting called each time, which is not what I expected.

Can someone enlighten me as to what's going on here and why this isn't behaving as I would expect? ie. why the User.all would be running when that whole action's output should have been cached ?


Solution

  • The filter chain halted message means that there is an around filter that stops the action from calling. This is likely to be the action cache, that stops the real action from happening. It did not yield to the action, because it found something in the cache, as suggested by the message above it.

    The User.all shouldn't be run at all, because it is in the action, but any before filters will get run. If your page is behind some form of authentication, than the authentication check might have triggered the SQL call. So you might want to double check where the SQL log really comes from.

    Also, the proper syntax (according to the rails guide at least) for expiring is:

    expire_action :action => :index
    

    More info: Rails Guide