class ActiveSerializer::Serializers::ObjectSerializer

Attributes

attrs[R]

Public Class Methods

new(object, options = {}) click to toggle source
# File lib/active_serializer/serializers/object_serializer.rb, line 4
def initialize(object, options = {})
  @object, @options = object, options
  @attrs = {}
end

Public Instance Methods

attribute(attr, val = nil) { || ... } click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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

Protected Instance Methods

nested_resource(name, object, options, serializer_class = self.class, &block) click to toggle source
# File lib/active_serializer/serializers/object_serializer.rb, line 95
def nested_resource(name, object, options, serializer_class = self.class, &block)
  return nil if !object
  serializer = serializer_class.new(object, options)
  if block_given?
    serializer.instance_exec(object, &block)
    serializer.attrs
  else
    if object.respond_to?(:to_hash)
      object.to_hash
    elsif object.is_a?(String)
      object
    end
  end
end
serialize_attribute(attribute, target) click to toggle source
# File lib/active_serializer/serializers/object_serializer.rb, line 91
def serialize_attribute(attribute, target)
  self.attrs[attribute] = target.send(attribute.to_s)
end