module

ActionController::Caching

Caching is a cheap way of speeding up slow applications by keeping the result of calculations, renderings, and database calls around for subsequent requests. Action Controller affords you three approaches in varying levels of granularity: Page, Action, Fragment.

You can read more about each approach and the sweeping assistance by clicking the modules below.

Note: To turn off all caching and sweeping, set Base.perform_caching = false.

Caching stores

All the caching stores from ActiveSupport::Cache is available to be used as backends for Action Controller caching. This setting only affects action and fragment caching as page caching is always written to disk.

Configuration examples (MemoryStore is the default):

  ActionController::Base.cache_store = :memory_store
  ActionController::Base.cache_store = :file_store, "/path/to/cache/directory"
  ActionController::Base.cache_store = :drb_store, "druby://localhost:9192"
  ActionController::Base.cache_store = :mem_cache_store, "localhost"
  ActionController::Base.cache_store = MyOwnStore.new("parameter")

Included modules

  • Actions
  • Fragments
  • Pages
  • SqlCache
  • Sweeping

Files

  • actionpack/lib/action_controller/caching.rb
  • actionpack/lib/action_controller/caching/actions.rb
  • actionpack/lib/action_controller/caching/fragments.rb
  • actionpack/lib/action_controller/caching/pages.rb
  • actionpack/lib/action_controller/caching/sql_cache.rb
  • actionpack/lib/action_controller/caching/sweeping.rb

Nested classes and modules

3Notes

Using sweepers in script/runner

yonosoytu · Aug 17, 20087 thanks

If you need to use some of your sweepers in a script/runner script or some rake task you can use this snipped:

require 'action_controller/test_process'

sweepers = [ProductSweeper, UserSweeper]

ActiveRecord::Base.observers = sweepers
ActiveRecord::Base.instantiate_observers

controller = ActionController::Base.new
controller.request = ActionController::TestRequest.new
controller.instance_eval do
@url = ActionController::UrlRewriter.new(request, {})
end

sweepers.each do |sweeper|
sweeper.instance.controller = controller
end

Your script will fire the ActiveRecord callbacks defined in that sweepers and you can use +expire_cache+, +expire_fragment+ and also the routing helpers you have defined (+hash_for_user_path+, +hash_for_product_path+, etc.).

Rails 2.1 caching internals

mutru · Jul 2, 20086 thanks

Rails 2.1 caching features are pretty much undocumented. Rob Anderton has documented some internal stuff here:

http://www.thewebfellas.com/blog/2008/6/9/rails-2-1-now-with-better-integrated-caching

Video tutorial

Soleone · Apr 29, 2009

If you want to get up to speed with Rails' caching and haven't seen it already, definitely check out this video series on Scaling Rails:

http://railslab.newrelic.com/scaling-rails