From cfcd7121231d50b77acd57d66d347223fcd8fca8 Mon Sep 17 00:00:00 2001 From: Luke Mayhew Date: Tue, 1 Apr 2014 22:38:58 -0600 Subject: [PATCH] Fix ArraySerializer's output when falling back on DefaultSerializer Change ArraySerializer's initialization of DefaultSerializer to pass :root => false in order to avoid adding root keys to each of the items in the array. This ensures consistent results between serializing arrays of objects with serializers and arrays of objects without serializers. Fixes #495. --- lib/active_model/array_serializer.rb | 2 +- test/array_serializer_test.rb | 21 +++++++++++++++++++++ test/test_fakes.rb | 23 +++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 518323ca..fc3159ad 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -83,7 +83,7 @@ module ActiveModel serializer = item.active_model_serializer end - serializable = serializer ? serializer.new(item, @options) : DefaultSerializer.new(item, @options) + serializable = serializer ? serializer.new(item, @options) : DefaultSerializer.new(item, @options.merge(:root => false)) if serializable.respond_to?(:serializable_hash) serializable.serializable_hash diff --git a/test/array_serializer_test.rb b/test/array_serializer_test.rb index d3001ac1..1f261772 100644 --- a/test/array_serializer_test.rb +++ b/test/array_serializer_test.rb @@ -2,6 +2,27 @@ require "test_helper" require "test_fakes" class ArraySerializerTest < ActiveModel::TestCase + + def test_array_items_do_not_have_root + array = [ + BasicActiveModel.new(:name => "First model"), + BasicActiveModel.new(:name => "Second model") + ] + expected = { "root" => [ + { :name => "First model" }, + { :name => "Second model" } + ] } + + default_serializer = array.active_model_serializer.new(array, :root => "root") + each_serializer = array.active_model_serializer.new(array, :root => "root", :each_serializer => BasicSerializer) + + default_json = default_serializer.as_json + each_json = each_serializer.as_json + + assert_equal(expected, default_json) + assert_equal(expected, each_json) + end + # serialize different typed objects def test_array_serializer model = Model.new diff --git a/test/test_fakes.rb b/test/test_fakes.rb index ab963714..dd2039e9 100644 --- a/test/test_fakes.rb +++ b/test/test_fakes.rb @@ -1,3 +1,26 @@ +class BasicActiveModel + include ActiveModel::Serializers::JSON + def initialize(hash = {}) + @attributes = hash + end + + def serializable_hash(*) + @attributes + end + + def method_missing(method) + if @attributes.key? method + @attributes[method] + else + raise NoMethodError + end + end +end + +class BasicSerializer < ActiveModel::Serializer + attributes :name +end + class Model def initialize(hash={}) @attributes = hash