Class: AdequateSerialization::InlineSerializer

Inherits:
Module
  • Object
show all
Defined in:
lib/adequate_serialization/inline_serializer.rb

Overview

With this module, you can define serializers inline in the object that they’re serializing. You use it with the ‘AdequateSerialization::inline` method to define the serializer dynamically, as in:

class User

attr_reader :id, :name, :title

def initialize(id:, name:, title: nil)
  @id = id
  @name = name
  @title = title
end

include AdequateSerialization.inline {
  attribute :id, :name
  attribute :title, optional: true
}

end

user = User.new(id: 1, name: ‘Clark Kent’) user.as_json # => :name=>“Clark Kent”

user = User.new(id: 2, name: ‘Diana Prince’, title: ‘Wonder Woman’) user.as_json(includes: :title) # => :name=>“Diana Prince”, :title=>“Wonder Woman”

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(&block) ⇒ InlineSerializer

Returns a new instance of InlineSerializer.



33
34
35
# File 'lib/adequate_serialization/inline_serializer.rb', line 33

def initialize(&block)
  @block = block
end

Instance Attribute Details

#blockObject (readonly)

Returns the value of attribute block.



31
32
33
# File 'lib/adequate_serialization/inline_serializer.rb', line 31

def block
  @block
end

Instance Method Details

#included(base) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/adequate_serialization/inline_serializer.rb', line 37

def included(base)
  base.include(Serializable)

  serializer_class = Class.new(Serializer)

  # In order to validate the attribute, we need to define the `serializes`
  # method before we evaluate the block
  serializer_class.define_singleton_method(:serializes) { base }
  serializer_class.class_eval(&block)

  # No need to memoize within the method because the block will hold on to
  # local variables for us.
  serializer = serializer_class.new
  base.define_singleton_method(:serializer) { serializer }
end