Ruby on Rails Action caching


Like page caching, action caching caches the whole page. The difference is that the request hits the Rails stack so before filters are run before the cache is served. It's extracted from Rails to actionpack-action_caching gem.

A common example is caching of an action that requires authentication:

class SecretIngredientsController < ApplicationController
  before_action :authenticate_user!, only: :index, :show
  caches_action :index
  def index
    @secret_ingredients = Recipe.find(params[:recipe_id]).secret_ingredients

Options include :expires_in, a custom :cache_path (for actions with multiple routes that should be cached differently) and :if/:unless to control when the action should be cached.

class RecipesController < ApplicationController
  before_action :authenticate_user!, except: :show
  caches_page :show
  caches_action :archive, expires_in:
  caches_action :index, unless: { request.format.json? }

When the layout has dynamic content, cache only the action content by passing layout: false.