From 7e83f0c29dce3537c23005d6431df86b0ca7052d Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Mon, 19 Aug 2013 16:55:03 -0300 Subject: [PATCH] Implement ArraySerializer --- lib/active_model/array_serializer.rb | 19 +++++++++++ lib/active_model/serializer.rb | 7 +++- lib/active_model_serializers.rb | 1 + .../active_model/array_serializer_test.rb | 32 +++++++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 lib/active_model/array_serializer.rb create mode 100644 test/unit/active_model/array_serializer_test.rb diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb new file mode 100644 index 00000000..083a1def --- /dev/null +++ b/lib/active_model/array_serializer.rb @@ -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 diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index cabead2d..940d59fa 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -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 diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index 26d08553..5ecc1b06 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -1,5 +1,6 @@ require 'active_model' require 'active_model/serializer' +require 'active_model/array_serializer' begin require 'action_controller' diff --git a/test/unit/active_model/array_serializer_test.rb b/test/unit/active_model/array_serializer_test.rb new file mode 100644 index 00000000..9a77f3fb --- /dev/null +++ b/test/unit/active_model/array_serializer_test.rb @@ -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