about 1 month ago
Tell Rails to use memcached. In production.rb (or staging.rb or...)
Specify the action you want to cache.
Create a sweeper. (app/sweepers/post_comment_sweeper.rb)
In each controller where we want our sweeper to be invoked if a observed model is saved or destroyed add the following line.
Now our cached action will be expired everytime a Post or a Comment is saved or destroyed.
BUT: this will only happen if the save or destroy is called from within one of the controllers we added the
The Sweeper will NOT be invoked if you do something like
I dont know why it's implemented that way but that's how it is.
Now fire up your memcached instance and you're set!
comments
ActionController::Base.cache_store = :mem_cache_store, "ip_address_of_memcached_server",
{:namespace => "my_super_app"}
Specify the action you want to cache.
class PostsController < ApplicationController
cache_action :posts_with_comments
def posts_with_comments
# shows all posts with comments
end
end
Create a sweeper. (app/sweepers/post_comment_sweeper.rb)
class PostCommentSweeper < ActionController::Caching::Sweeper
observe Post, Comment
def after_save(rec)
expire_cache_for(rec)
end
def after_destroy(rec)
expire_cache_for(rec)
end
private
def expire_cache_for(rec)
expire_action(:controller => '/posts', :action => 'posts_with_comments')
end
end
Note: the '/' in the controller name is important if you will invoke the sweeper from a nested controller. Without the '/' the cache_key will be wrong and rails will not find your data in the cache.
In each controller where we want our sweeper to be invoked if a observed model is saved or destroyed add the following line.
cache_sweeper :post_comment_sweeper
Now our cached action will be expired everytime a Post or a Comment is saved or destroyed.
BUT: this will only happen if the save or destroy is called from within one of the controllers we added the
cache_sweeper to.
The Sweeper will NOT be invoked if you do something like
Post.last.save in script/console.
I dont know why it's implemented that way but that's how it is.
Now fire up your memcached instance and you're set!