A gem for caching HTTP responses.
The gem was built with an idea to implement a class which will create options for the ActionController::ConditionalGet#stale? method. It allows to cache any kind of objects, not only records or collections (unlike of #stale?).
Add one of these lines to your application's Gemfile depending on your Rails version:
# Rails 5.2
gem 'stale_options', '~> 1.0.0'
# Rails 6.0
gem 'stale_options', '~> 1.1.0'
# Rails 6.1
gem 'stale_options', '~> 1.2.0'
# Rails 7.0
gem 'stale_options', '~> 1.3.0'And then execute:
bundle installStaleOptions.create(Item.all)
=> {:etag=>"39f08c583b023142dd64b0922dfaefd4", :last_modified=>2018-07-04 18:05:22 UTC}
The method accepts an optional second parameter (see Caching options).
There are two options for caching, cache_by and last_modified:
:cache_byStringorSymbol. The name of the method that returns the unique identifier of the object for caching, which is used to setetagof the resulting options. Set it toitselfif you don't have such a method (see example below) and the gem will generateetagfor you.- Default:
:updated_at.
:last_modifiedStringorSymbol. The name of the method that returns an instance ofActiveSupport::TimeWithZone,DateTimeorTime.ActiveSupport::TimeWithZone,DateTime,Timeornilto set:last_modifieddirectly.- Default:
:updated_at.
StaleOptions.create(Task.all, last_modified: :done_at)
=> {:etag=>"ce8d2fbc9b815937b59e8815d8a85c21", :last_modified=>2018-06-30 18:25:07 UTC}
StaleOptions.create([1, 2, 3], cache_by: :itself, last_modified: nil)
=> {:etag=>"73250e72da5d8950b6bbb16044353d26", :last_modified=>nil}
StaleOptions.create({ a: 'a', b: 'b', c: 'c' }, cache_by: :itself, last_modified: Time.now)
=> {:etag=>"fec76eca1192bc7371e44d517b56c93f", :last_modified=>2018-07-08 07:08:48 UTC}
In your controller:
# To render a template:
class PostsController < ApplicationController
include StaleOptions::Backend
def index
if_stale?(Post.all) do |posts|
@posts = posts
end
end
end
# Or, to render json:
class PostsController < ApplicationController
include StaleOptions::Backend
def index
if_stale?(Post.all) do |posts|
render json: posts
end
end
endHere we're using the #if_stale? method which was added to the controller by including the StaleOptions::Backend module. The method accepts two arguments record and options (yeah, just like StaleOptions.create).
Under the hood, it calls ActionController::ConditionalGet#stale? with options created by StaleOptions.create:
def if_stale?(record, options = {})
yield(record) if stale?(StaleOptions.create(record, options))
endBug reports and pull requests are welcome on GitHub at https://github.com/digaev/stale_options.
The gem is available as open source under the terms of the MIT License.