Renderizar json em cache usando rails e redis

Requisitos

  • trilhos
  • redis-rails
class MyController
def index
render_cached_json
("api:foos", expires_in: 1.hour) do
Foo.all
end
end

def render_cached_json(cache_key, opts = {}, &block)
opts
[:expires_in] ||= 1.day

expires_in opts
[:expires_in], :public => true
data
= Rails.cache.fetch(cache_key, {raw: true}.merge(opts)) do
block
.call.to_json
end

render
:json => data
end
end

Isso armazenará json renderizado em redis, plain json, como string, como você deve sempre fazer. Observe onde está to_jsone raw: trueopção. E você obtém cabeçalhos de cache HTTP gratuitamente

Por quê?

Porque respond_with é uma merda e armazenar ActiveSupport::Cache::Entryobjetos empacotados no redis é simplesmente estúpido.