Skip to content

Commit c372c38

Browse files
committed
Fix root/meta for ArraySerializer
1 parent a59cc4c commit c372c38

File tree

4 files changed

+47
-22
lines changed

4 files changed

+47
-22
lines changed

lib/active_model/serializer/adapter/json.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ module ActiveModel
44
class Serializer
55
class Adapter
66
class Json < Adapter
7+
def initialize(serializer, options = {})
8+
super
9+
serializer.root = true if @options[:root]
10+
end
11+
712
def serializable_hash(options = {})
813
if serializer.respond_to?(:each)
914
@result = serializer.map{|s| self.class.new(s).serializable_hash }

lib/active_model/serializer/array_serializer.rb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ class ArraySerializer
44
include Enumerable
55
delegate :each, to: :@objects
66

7-
attr_reader :meta, :meta_key
7+
attr_accessor :meta, :meta_key, :root
88

99
def initialize(objects, options = {})
10+
@root = options[:root]
1011
options.merge!(root: nil)
1112

1213
@objects = objects.map do |object|
@@ -21,11 +22,11 @@ def initialize(objects, options = {})
2122
end
2223

2324
def json_key
24-
@objects.first.json_key if @objects.first
25-
end
26-
27-
def root=(root)
28-
@objects.first.root = root if @objects.first
25+
if root == true && @objects.first
26+
@objects.first.class.root_name
27+
else
28+
root
29+
end
2930
end
3031
end
3132
end

test/array_serializer_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,20 @@ def test_meta_and_meta_key_attr_readers
3838
assert_equal @serializer.meta, "the meta"
3939
assert_equal @serializer.meta_key, "the meta key"
4040
end
41+
42+
def test_root_attr_reader
43+
root_content = {root: true}
44+
@serializer = ArraySerializer.new([@comment, @post], root_content)
45+
46+
assert_equal true, @serializer.root
47+
end
48+
49+
def test_root_attr_reader_with_empty_array
50+
root_content = {root: true}
51+
@serializer = ArraySerializer.new([], root_content)
52+
53+
assert_equal @serializer.root, true
54+
end
4155
end
4256
end
4357
end

test/serializers/meta_test.rb

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,27 @@ def test_meta_key_is_used
4848
assert_equal expected, adapter.as_json
4949
end
5050

51-
def test_meta_is_not_used_on_arrays
52-
serializer = ArraySerializer.new([@blog], root: "blog", meta: {total: 10}, meta_key: "haha_meta")
53-
adapter = ActiveModel::Serializer::Adapter::Json.new(serializer)
54-
expected = [{
55-
id: 1,
56-
name: "AMS Hints",
57-
writer: {
58-
id: 2,
59-
name: "Steve"
60-
},
61-
articles: [{
62-
id: 3,
63-
title: "AMS",
64-
body: nil
65-
}]
66-
}]
51+
def test_meta_is_used_on_arrays
52+
serializer = ArraySerializer.new([@blog], meta: {total: 10}, meta_key: "haha_meta")
53+
adapter = ActiveModel::Serializer::Adapter::Json.new(serializer, root: 'blog')
54+
expected = {
55+
'blog' => [{
56+
id: 1,
57+
name: "AMS Hints",
58+
writer: {
59+
id: 2,
60+
name: "Steve"
61+
},
62+
articles: [{
63+
id: 3,
64+
title: "AMS",
65+
body: nil
66+
}]
67+
}],
68+
'haha_meta' => {
69+
total: 10
70+
}
71+
}
6772
assert_equal expected, adapter.as_json
6873
end
6974

0 commit comments

Comments
 (0)