- Serve gzip'd content
- Add ETag and 304 Not Modified headers
- Generational caching
- No explicit expiry
This gem supports the following versions of Ruby and Rails:
- Ruby 2.7.0+
- Rails 6.0.0+
-
include the gem in your Gemfile
gem 'response_bank'
-
add an initializer file. We need to configure the
acquire_lock
method, set the cache store and the loggerrequire '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
-
enables caching on your application
config.action_controller.perform_caching = true
-
use
#response_cache
method to any desired controller's actionclass PostsController < ApplicationController def show response_cache do @post = @shop.posts.find(params[:id]) respond_with(@post) end end end
-
(optional) set a custom TTL for the cache by overriding the
write_to_backing_cache_store
method in your initializer filemodule ResponseBank CACHE_TTL = 30.minutes def write_to_backing_cache_store(_env, key, payload, expires_in: nil) cache_store.write(key, payload, raw: true, expires_in: expires_in || CACHE_TTL) end end
-
(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
ResponseBank is released under the MIT License.