Implement ArraySerializer

This commit is contained in:
Santiago Pastorino 2013-08-19 16:55:03 -03:00
parent 61a1669a86
commit 7e83f0c29d
4 changed files with 58 additions and 1 deletions

View File

@ -0,0 +1,19 @@
module ActiveModel
class ArraySerializer
def initialize(object, options={})
@object = object
@options = options
end
def serializable_array
@object.map do |item|
if serializer = Serializer.serializer_for(item)
serializer.new(item).serializable_object(@options.merge(root: nil))
else
item.as_json
end
end
end
alias serializable_object serializable_array
end
end

View File

@ -9,7 +9,11 @@ module ActiveModel
end
def serializer_for(resource)
"#{resource.class.name}Serializer".safe_constantize
if resource.respond_to?(:to_ary)
ArraySerializer
else
"#{resource.class.name}Serializer".safe_constantize
end
end
attr_accessor :_root, :_attributes, :_associations
@ -114,6 +118,7 @@ module ActiveModel
hash = attributes
hash.merge! associations
end
alias serializable_object serializable_hash
def as_json(options={})
if root = options[:root] || self.root

View File

@ -1,5 +1,6 @@
require 'active_model'
require 'active_model/serializer'
require 'active_model/array_serializer'
begin
require 'action_controller'

View File

@ -0,0 +1,32 @@
require 'test_helper'
require 'active_model/serializer'
module ActiveModel
class ArraySerializer
class Test < ActiveModel::TestCase
def setup
array = [1, 2, 3]
@serializer = ActiveModel::Serializer.serializer_for(array).new(array)
end
def test_serializer_for_array_returns_appropriate_type
assert_kind_of ArraySerializer, @serializer
end
def test_array_serializer_serializes_simple_objects
assert_equal [1, 2, 3], @serializer.serializable_array
end
def test_array_serializer_serializes_models
array = [Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),
Profile.new({ name: 'Name 2', description: 'Description 2', comments: 'Comments 2' })]
serializer = ArraySerializer.new(array)
expected = [{'name' => 'Name 1', 'description' => 'Description 1'},
{'name' => 'Name 2', 'description' => 'Description 2'}]
assert_equal expected, serializer.serializable_array
end
end
end
end