Module: Barley::Serializable

Extended by:
ActiveSupport::Concern
Defined in:
lib/barley/serializable.rb

Overview

Makes a Model serializable

  • Allows setting a default model Serializer

Examples:

class Item < ApplicationRecord
  include Barley::Serializable

 # optionally define the default serializer, otherwise defaults to ItemSerializer
 serializer MyCustomItemSerializer, cache: true
end

#> Item.as_json

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.serializer(klass, cache: false) ⇒ Object

Examples:

without cache

serializer ItemSerializer

with cache

serializer ItemSerializer, cache: true

with cache and expires_in

serializer ItemSerializer, cache: {expires_in: 1.hour}

Parameters:

  • the serializer class

  • (defaults to: false)

    whether to cache the result, or a hash with options for the cache



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/barley/serializable.rb', line 32

def serializer(klass, cache: false)
  # We need to silence the warnings because we are defining a method with the same name as the parameter
  # This avoids :
  # - warning: method redefined; discarding old serializer
  # - warning: previous definition of serializer was here
  Kernel.silence_warnings do
    define_method(:serializer) do
      klass.new(self, cache: cache)
    end
  end
end

Instance Method Details

#as_json(options = nil) ⇒ Hash

Note:

this method does not provide default rails options like only or except. This is because the Barley serializer should be the only place where the attributes are defined.

Serializes the model

Parameters:

  • (defaults to: nil)

    a customizable set of options

Options Hash (options):

  • :serializer (Class)

    the serializer to use

  • :cache (Boolean, Hash<Symbol, ActiveSupport::Duration>)

    whether to cache the result, or a hash with options for the cache

  • :root (Boolean)

    whether to include the root key

Returns:

  • the serialized attributes



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/barley/serializable.rb', line 62

def as_json(options = nil)
  options ||= {}
  serializer = options[:serializer] || self.serializer.class
  cache = options[:cache] || false
  root = options[:root] || false
  begin
    serializer.new(self, cache: cache, root: root).serializable_hash
      .as_json(only: options[:only], except: options[:except])
  rescue NameError
    raise Barley::Error, "Could not find serializer for #{self}. Please define a #{serializer} class."
  end
end