diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index bc96fbfa..5adf4049 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 @@ -522,4 +528,4 @@ module ActiveModel ActiveSupport::Notifications.instrument("#{name}.serializer", payload, &block) end end -end \ No newline at end of file +end 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