ResponseBank Build Status

Features

  • Serve gzip'd content
  • Add ETag and 304 Not Modified headers
  • Generational caching
  • No explicit expiry

Support

This gem supports the following versions of Ruby and Rails:

  • Ruby 2.4.0+
  • Rails 5.0.0+

Usage

  1. include the gem in your Gemfile
gem 'response_bank'
  1. add an initializer file. We need to configure the acquire_lock method, set the cache store and the logger
require 'response_bank'

module ResponseBank
  LOCK_TTL = 90

  class << self
    def acquire_lock(cache_key)
      cache_store.write("#{cache_key}:lock", '1', unless_exist: true, expires_in: LOCK_TTL, raw: true)
    end
  end
end

ResponseBank.cache_store = ActiveSupport::Cache.lookup_store(Rails.configuration.cache_store)
ResponseBank.logger = Rails.logger

  1. enables caching on your application

    config.action_controller.perform_caching = true
    
  2. use #response_cache method to any desired controller's action

class PostsController < ApplicationController
  def show
    response_cache do
      @post = @shop.posts.find(params[:id])
      respond_with(@post)
    end
  end
end
  1. (optional) set a custom TTL for the cache by overriding the write_to_backing_cache_store method in your initializer file

    module ResponseBank
    CACHE_TTL = 30.minutes
    def write_to_backing_cache_store(_env, key, payload, expires_in: CACHE_TTL)
    cache_store.write(key, payload, raw: true, expires_in: expires_in)
    end
    end
    
  2. (optional) override custom cache key data. For default, cache key is defined by URL and query string

class PostsController < ApplicationController
  before_action :set_shop

  def index
    response_cache do
      @post = @shop.posts
      respond_with(@post)
    end
  end

  def show
    response_cache do
      @post = @shop.posts.find(params[:id])
      respond_with(@post)
    end
  end

  def another_action
    # custom cache key data
    cache_key = {
      action: action_name,
      format: request.format,
      shop_updated_at: @shop.updated_at
      # you may add more keys here
    }
    response_cache cache_key do
      @post = @shop.posts.find(params[:id])
      respond_with(@post)
    end
  end

  # override default cache key data globally per class
  def cache_key_data
    {
      action: action_name,
      format: request.format,
      params: params.slice(:id),
      shop_version: @shop.version
      # you may add more keys here
     }
  end

  def set_shop
    # @shop = ...
  end
end

License

ResponseBank is released under the MIT License.