Agile Web Development

Build it. Launch it. Love it.

Referenced Page Caching

Referenced 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!

Vitals

Repository http://svn.techno-weenie.net/projects/plugins/referenced_page_caching/
License Rails' (MIT)
Rating (1 vote)
Owner Rick Olson
Created 19 July 2006

Comments

Add a comment