Flowdock

Sweepers are the terminators of the caching world and responsible for expiring caches when model objects change. They do this by being half-observers, half-filters and implementing callbacks for both roles. A Sweeper example:

  class ListSweeper < ActionController::Caching::Sweeper
    observe List, Item

    def after_save(record)
      list = record.is_a?(List) ? record : record.list
      expire_page(:controller => "lists", :action => %w( show public feed ), :id => list.id)
      expire_action(:controller => "lists", :action => "all")
      list.shares.each { |share| expire_page(:controller => "lists", :action => "show", :id => share.url_key) }
    end
  end

The sweeper is assigned in the controllers that wish to have its job performed using the cache_sweeper class method:

  class ListsController < ApplicationController
    caches_action :index, :show, :public, :feed
    cache_sweeper :list_sweeper, :only => [ :edit, :destroy, :share ]
  end

In the example above, four actions are cached and three actions are responsible for expiring those caches.

You can also name an explicit class in the declaration of a sweeper, which is needed if the sweeper is in a module:

  class ListsController < ApplicationController
    caches_action :index, :show, :public, :feed
    cache_sweeper OpenBar::Sweeper, :only => [ :edit, :destroy, :share ]
  end
Show files where this module is defined (1 file)
Register or log in to add new notes.
June 29, 2008
5 thanks
March 24, 2009 - (>= v2.3.2)
2 thanks

if you get NameError: uninitialized constant ActionController::Caching::Sweeper

I got hit with this on an upgrade. Had a reference to ApplicationController::Base in development.rb (prod as well) which caused this problem http://rails.lighthouseapp.com/projects/8994/tickets/1977

Fix was to remove the loading of ApplicationController::Base and put it in an initializer (where it should have been).