ResponseBank 
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
- 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 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
enables caching on your application
config.action_controller.perform_caching = true
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
(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: CACHE_TTL) cache_store.write(key, payload, raw: true, expires_in: expires_in) 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
License
ResponseBank is released under the MIT License.