The sweeper is a new mechanism inducted in rails which allows you to get around having a ton of expire_{page,action,fragment} calls in your code.It does this by moving all the work required to expire cached content into an ActionController::Caching::Sweeper subclass. This class is an observer and looks for changes to an object via callbacks, and when a change occurs it expires the caches associated with that object in an around or after filter.
Continuing with our Product controller example, we could rewrite it with a sweeper like this:
class ProductSweeper < ActionController::Caching::Sweeper
  observe Product # it keep watch on the Product Model
 
  # As soon as sweeper detects that any new Product was created call this
  def after_create(product)
    expire_cache_for(product)
  end
 
  # As soon as sweeper detects that a Product was updated call this
  def after_update(product)
    expire_cache_for(product)
  end
 
  # As soon as sweeper detects that a Product was deleted call this
  def after_destroy(product)
    expire_cache_for(product)
  end
 
  private
  def expire_cache_for(product)
    # Expire the index page now that we added a new product
    expire_page(:controller => 'products', :action => 'index')
 
    # Expire a fragment
    expire_fragment('all_available_products')
  end
end
You may notice that the actual product gets passed to the sweeper, so if we were caching the edit action for each product, we could add an expire method which specifies the page we want to expire:
expire_action(:controller => 'products', :action => 'edit', :id => product)
Then we add it to our controller to tell it to call the sweeper when certain actions are called. So, if we wanted to expire the cached content for the list and edit actions when the create action was called, we could do the following:
class ProductsController < ActionController
 
  before_filter :authenticate
  caches_action :index
  cache_sweeper :product_sweeper
 
  def index
    @products = Product.all
  end
 
end
So just get rid of unnecessary caching and refresh the caching using sweepers mechanism.
 
 
No comments:
Post a Comment