Class: ActiveSerializer::Serializers::ObjectSerializer

Inherits:
Object
  • Object
show all
Defined in:
lib/active_serializer/serializers/object_serializer.rb

Direct Known Subclasses

RestrictFieldsObjectSerializer

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(object, options = {}) ⇒ ObjectSerializer

Returns a new instance of ObjectSerializer.



4
5
6
7
# File 'lib/active_serializer/serializers/object_serializer.rb', line 4

def initialize(object, options = {})
  @object, @options = object, options
  @attrs = {}
end

Instance Attribute Details

#attrsObject (readonly)

Returns the value of attribute attrs.



2
3
4
# File 'lib/active_serializer/serializers/object_serializer.rb', line 2

def attrs
  @attrs
end

Instance Method Details

#attribute(attr, val = nil, &block) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
# File 'lib/active_serializer/serializers/object_serializer.rb', line 77

def attribute(attr, val = nil, &block)
  if block_given?
    self.attrs[attr] = yield
    return
  end

  if @object.blank?
    raise ArgumentError, "Neither object was specified nor block was given"
  end
  self.attrs[attr] = val || @object.send(attr.to_s)
end

#attributes(*attrs, &block) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/active_serializer/serializers/object_serializer.rb', line 62

def attributes(*attrs, &block)
  if !attrs.last.is_a?(Symbol) && !attrs.last.is_a?(String)
    object = attrs.last
    attrs.delete(attrs.last)
  end
  if !@object && !object
    raise ArgumentError, "Object was not specified"
  end

  target = object || @object
  Array.wrap(attrs).flatten.each do |attribute|
    serialize_attribute(attribute, target)
  end
end

#namespace(name, &block) ⇒ Object



22
23
24
25
26
# File 'lib/active_serializer/serializers/object_serializer.rb', line 22

def namespace(name, &block)
  serializer = self.class.new(@object, @options)
  serializer.instance_exec(@object, &block)
  self.attrs[name] = serializer.attrs
end

#resource(name, object = nil, &block) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/active_serializer/serializers/object_serializer.rb', line 28

def resource(name, object = nil, &block)
  raise "You should set name for resource" unless name
  raise "You should specify object" if @object.nil? && object.nil?
  nested_name = name
  nested_object = object || @object.send(nested_name)
  unless nested_object
    self.attrs[nested_name] = {}
  else
    if block_given?
      self.attrs[nested_name] = nested_resource(nested_name, nested_object, @options, &block)
    elsif nested_object.respond_to?(:to_hash)
      self.attrs[nested_name] = nested_object.to_hash
    elsif nested_object.is_a?(String)
      self.attrs[nested_name] = nested_object
    else
      raise "You should specify block or declare 'to_hash' method"
    end
  end
end

#resources(name, objects = nil, &block) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/active_serializer/serializers/object_serializer.rb', line 48

def resources(name, objects = nil, &block)
  raise "You should specify object" if @object.nil? && objects.nil?
  objects = objects.flatten unless objects.nil?
  nested_objects = objects || @object.send(name.to_s)
  unless nested_objects
    self.attrs[name] = []
  else
    self.attrs[name] = (nested_objects || []).inject([]) do |result, obj|
      resource = nested_resource(name, obj, @options, &block)
      resource.empty? ? result : (result << resource)
    end
  end
end

#serialize_collection(name, objects, klass, *args) ⇒ Object

Raises:

  • (ArgumentError)


9
10
11
12
13
14
15
# File 'lib/active_serializer/serializers/object_serializer.rb', line 9

def serialize_collection(name, objects, klass, *args)
  raise ArgumentError, "You should provide serializer klass" if !klass
  self.attrs[name] = []
  objects.each do |object|
   self.attrs[name] << klass.serialize(object, *args)
  end
end

#serialize_entity(name, object, klass, *args) ⇒ Object

Raises:

  • (ArgumentError)


17
18
19
20
# File 'lib/active_serializer/serializers/object_serializer.rb', line 17

def serialize_entity(name, object, klass, *args)
  raise ArgumentError, "You should provide serializer klass" if !klass
  self.attrs[name] = klass.serialize(object, *args)
end