Plugins - Referenced Page Caching
Add to favoritesReferenced Page Caching is a small wrapper around Rails’ page caching. It allows you to add references to a current page’s cache file. These references are then used to expire all the pages that are referenced when it is modified or destroyed.
The Cached Page model
The Cached Page model stores the cached page urls and the references. The ‘reference’ string is made by joining the ID and class name of a reference:
1:Post, 3:Comment, etc
Here’s a sample table schema:
create_table :cached_pages, :force => true do |t| t.column :url, :string, :limit => 255 t.column :references, :text t.column :updated_at, :datetime end
Run the cached page migration generator to create one:
./script/generate cached_page_migration
Caboose::Caching::ReferencedCachingSystem
This module is added to ActionController::Base automatically. Here’s an example of using it:
class PostController < ApplicationController
after_filter :add_post_references, :only => :index
caches_page_with_references :list
def list
@posts = Post.find :all
end
protected
def add_post_references
self.cached_references += @posts
end
end
Expiring pages
Ah, the fun part of any caching system. First, generate a sweeper:
./script/generate referenced_cache_sweeper reference
Add the sweeper to your controller:
class PostController < ApplicationController
cache_sweeper :reference_sweeper, :only => [:create, :update, :destroy]
def create
@post = Post.create(params[:post])
end
end
Be sure to modify the sweeper for any special rules in your application.
The Cache Manager
After that, visit /referenced_page_caching in your application to manage and sweep the cache.
It’s understandable that you may want to require authentication. Add this to your config/environments/production.rb:
# config/environments/production.rb
config.after_initialize do
require 'application' unless Object.const_defined?(:ApplicationController)
ReferencedPageCachingController.class_eval do
# The controller is disabled by default
self.enabled = true
before_filter :login_required
protected
# only allow admins
# this obviously depends on how your auth system works
def authorized?
current_user.is_a?(Admin)
end
end
end
The exact code of course depends on the specific needs of your application.
CREDITS
Rick Olson - model/controller code Josh Goebel - design
Good luck!
http://svn.techno-weenie.net/projects/plugins/referenced_page_caching/
Rails' (MIT)
Misc. Enhancements
