From 1c820a9ba7ca80f9bd06f2916cda41d71c96ca53 Mon Sep 17 00:00:00 2001 From: Peter Harkins Date: Thu, 21 Jun 2012 11:12:13 -0500 Subject: [PATCH] Allow setting the serializer for ArraySerializer. --- lib/active_model/serializer.rb | 8 +++++++- test/serializer_test.rb | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index fa1cfd19..6c63f654 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -40,7 +40,13 @@ module ActiveModel def serializable_array @object.map do |item| - if item.respond_to?(:active_model_serializer) && (serializer = item.active_model_serializer) + if @options.has_key? :each_serializer + serializer = @options[:each_serializer] + elsif item.respond_to?(:active_model_serializer) + serializer = item.active_model_serializer + end + + if serializer serializer.new(item, @options) else item diff --git a/test/serializer_test.rb b/test/serializer_test.rb index 082cd6bf..4d02715e 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -411,6 +411,24 @@ class SerializerTest < ActiveModel::TestCase assert_equal({ :items => [ hash.as_json ]}, serializer.as_json) end + class CustomPostSerializer < ActiveModel::Serializer + attributes :title + end + + def test_array_serializer_with_specified_seriailizer + post1 = Post.new(:title => "Post1", :author => "Author1", :id => 1) + post2 = Post.new(:title => "Post2", :author => "Author2", :id => 2) + + array = [ post1, post2 ] + + serializer = array.active_model_serializer.new array, :each_serializer => CustomPostSerializer + + assert_equal([ + { :title => "Post1" }, + { :title => "Post2" } + ], serializer.as_json) + end + class CustomBlog < Blog attr_accessor :public_posts, :public_user end