diff --git a/lib/active_model/serializer/adapter/json.rb b/lib/active_model/serializer/adapter/json.rb index b36ef4007..cf5ff2827 100644 --- a/lib/active_model/serializer/adapter/json.rb +++ b/lib/active_model/serializer/adapter/json.rb @@ -4,6 +4,11 @@ module ActiveModel class Serializer class Adapter class Json < Adapter + def initialize(serializer, options = {}) + super + serializer.root = true if @options[:root] + end + def serializable_hash(options = {}) if serializer.respond_to?(:each) @result = serializer.map{|s| self.class.new(s).serializable_hash } diff --git a/lib/active_model/serializer/array_serializer.rb b/lib/active_model/serializer/array_serializer.rb index a5f7b6a1c..18a5bd912 100644 --- a/lib/active_model/serializer/array_serializer.rb +++ b/lib/active_model/serializer/array_serializer.rb @@ -4,9 +4,10 @@ class ArraySerializer include Enumerable delegate :each, to: :@objects - attr_reader :meta, :meta_key + attr_accessor :meta, :meta_key, :root def initialize(objects, options = {}) + @root = options[:root] options.merge!(root: nil) @objects = objects.map do |object| @@ -21,11 +22,11 @@ def initialize(objects, options = {}) end def json_key - @objects.first.json_key if @objects.first - end - - def root=(root) - @objects.first.root = root if @objects.first + if root == true && @objects.first + @objects.first.class.root_name + else + root + end end end end diff --git a/test/array_serializer_test.rb b/test/array_serializer_test.rb index 259793f79..0bae9a574 100644 --- a/test/array_serializer_test.rb +++ b/test/array_serializer_test.rb @@ -38,6 +38,20 @@ def test_meta_and_meta_key_attr_readers assert_equal @serializer.meta, "the meta" assert_equal @serializer.meta_key, "the meta key" end + + def test_root_attr_reader + root_content = {root: true} + @serializer = ArraySerializer.new([@comment, @post], root_content) + + assert_equal true, @serializer.root + end + + def test_root_attr_reader_with_empty_array + root_content = {root: true} + @serializer = ArraySerializer.new([], root_content) + + assert_equal true, @serializer.root + end end end end diff --git a/test/serializers/meta_test.rb b/test/serializers/meta_test.rb index 4494d70f8..2f3844d8e 100644 --- a/test/serializers/meta_test.rb +++ b/test/serializers/meta_test.rb @@ -48,22 +48,27 @@ def test_meta_key_is_used assert_equal expected, adapter.as_json end - def test_meta_is_not_used_on_arrays - serializer = ArraySerializer.new([@blog], root: "blog", meta: {total: 10}, meta_key: "haha_meta") - adapter = ActiveModel::Serializer::Adapter::Json.new(serializer) - expected = [{ - id: 1, - name: "AMS Hints", - writer: { - id: 2, - name: "Steve" - }, - articles: [{ - id: 3, - title: "AMS", - body: nil - }] - }] + def test_meta_is_used_on_arrays + serializer = ArraySerializer.new([@blog], meta: {total: 10}, meta_key: "haha_meta") + adapter = ActiveModel::Serializer::Adapter::Json.new(serializer, root: 'blog') + expected = { + 'blog' => [{ + id: 1, + name: "AMS Hints", + writer: { + id: 2, + name: "Steve" + }, + articles: [{ + id: 3, + title: "AMS", + body: nil + }] + }], + 'haha_meta' => { + total: 10 + } + } assert_equal expected, adapter.as_json end