module CacheCrispies::Controller

A Rails concern designed to be used in Rails controllers to provide access to the cache_render method

Constants

OJ_MODE

The serialization mode that should be used with the oj gem

Public Instance Methods

cache_render( serializer, cacheable, key: nil, collection: nil, status: nil, meta: {}, meta_key: :meta, **options ) click to toggle source

Renders the provided cacheable object to JSON using the provided serializer

@param serializer [CacheCrispies::Base] a class inheriting from

CacheCrispies::Base

@param cacheable [Object] can be any object. But is typically a Rails

model inheriting from ActiveRecord::Base

@param key [Symbol] the name of the root key to nest the JSON

data under

@param collection [Boolean] whether to render the data as a

collection/array or a single object

@param status [Integer, Symbol] the HTTP response status code or

Rails-supported symbol. See
https://guides.rubyonrails.org/layouts_and_rendering.html#the-status-option

@param meta [Hash] data to include as metadata under a root key @param meta_key [Symbol] they key to store the metadata under @param [Hash] options any optional values from the serializer instance @return [void]

# File lib/cache_crispies/controller.rb, line 30
def cache_render(
  serializer,
  cacheable,
  key: nil, collection: nil, status: nil,
  meta: {}, meta_key: :meta,
  **options
)
  plan = CacheCrispies::Plan.new(
    serializer,
    cacheable,
    key: key, collection: collection,
    **options
  )

  if CacheCrispies.config.etags?
    response.weak_etag = plan.etag
  end

  serializer_json =
    if plan.collection?
      plan.cache do
        CacheCrispies::Collection.new(
          cacheable, serializer, options
        ).as_json
      end
    else
      plan.cache { serializer.new(cacheable, options).as_json }
    end

  json_hash = plan.wrap(serializer_json)
  json_hash[meta_key] = meta if meta.present?

  render_hash = { json: Oj.dump(json_hash, mode: OJ_MODE) }
  render_hash[:status] = status if status

  render render_hash
end