diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index b4d1c9ed..7ec17576 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -52,7 +52,15 @@ module ActiveModel @options[:hash] = hash = {} @options[:unique_values] = {} - array = serializable_array.map(&:serializable_hash) + array = serializable_array.map do |item| + if item.is_a?(Hash) + item + elsif item.respond_to?(:serializable_hash) + item.serializable_hash + else + item.as_json + end + end if root = @options[:root] hash.merge!(root => array) diff --git a/test/serializer_test.rb b/test/serializer_test.rb index d6ade23c..6e576d17 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -375,17 +375,18 @@ class SerializerTest < ActiveModel::TestCase }, serializer.as_json) end + # serialize different typed objects def test_array_serializer model = Model.new user = User.new comments = Comment.new(:title => "Comment1", :id => 1) array = [model, user, comments] - serializer = array.active_model_serializer.new(array, {:scope => true}) + serializer = array.active_model_serializer.new(array, :scope => {:scope => true}) assert_equal([ { :model => "Model" }, - { :user => { :last_name=> "Valim", :ok => true, :first_name => "Jose", :scope => true } }, - { :comment => { :title => "Comment1" } } + { :last_name => "Valim", :ok => true, :first_name => "Jose", :scope => true }, + { :title => "Comment1" } ], serializer.as_json) end @@ -403,6 +404,13 @@ class SerializerTest < ActiveModel::TestCase ]}, serializer.as_json) end + def test_array_serializer_with_hash + hash = {:value => "something"} + array = [hash] + serializer = array.active_model_serializer.new(array, :root => :items) + assert_equal({ :items => [ hash ]}, serializer.as_json) + end + class CustomBlog < Blog attr_accessor :public_posts, :public_user end