File tree 3 files changed +29
-4
lines changed
lib/active_model/serializer
3 files changed +29
-4
lines changed Original file line number Diff line number Diff line change @@ -10,8 +10,14 @@ class CollectionSerializer
10
10
def initialize ( resources , options = { } )
11
11
@root = options [ :root ]
12
12
@object = resources
13
+
14
+ serializer_context_class = options . fetch ( :serializer_context_class , ActiveModel ::Serializer )
15
+
16
+ if resources . blank? && options [ :serializer ]
17
+ @each_serializer = options [ :serializer ]
18
+ end
19
+
13
20
@serializers = resources . map do |resource |
14
- serializer_context_class = options . fetch ( :serializer_context_class , ActiveModel ::Serializer )
15
21
serializer_class = options . fetch ( :serializer ) { serializer_context_class . serializer_for ( resource ) }
16
22
17
23
if serializer_class . nil? # rubocop:disable Style/GuardClause
@@ -27,7 +33,7 @@ def success?
27
33
end
28
34
29
35
def json_key
30
- root || derived_root
36
+ root || derived_root || guess_root || default_root
31
37
end
32
38
33
39
def paginated?
@@ -43,8 +49,15 @@ def paginated?
43
49
private
44
50
45
51
def derived_root
46
- key = serializers . first . try ( :json_key ) || object . try ( :name ) . try ( :underscore )
47
- key . try ( :pluralize )
52
+ serializers . first . try ( :json_key ) . try ( :pluralize )
53
+ end
54
+
55
+ def default_root
56
+ object . try ( :name ) . try ( :underscore ) . try ( :pluralize )
57
+ end
58
+
59
+ def guess_root
60
+ @each_serializer . try ( :allocate ) . try ( :json_key ) . try ( :pluralize )
48
61
end
49
62
end
50
63
end
Original file line number Diff line number Diff line change @@ -84,6 +84,12 @@ def test_json_key_with_resource_without_name_and_no_serializers
84
84
assert_nil serializer . json_key
85
85
end
86
86
87
+ def test_json_key_with_empty_resources_with_serializer
88
+ resource = [ ]
89
+ serializer = collection_serializer . new ( resource , serializer : MessagesSerializer )
90
+ assert_equal 'messages' , serializer . json_key
91
+ end
92
+
87
93
def test_json_key_with_root
88
94
expected = 'custom_root'
89
95
serializer = collection_serializer . new ( @resource , root : expected )
Original file line number Diff line number Diff line change @@ -183,6 +183,12 @@ def json_key
183
183
end
184
184
end
185
185
186
+ MessagesSerializer = Class . new ( ActiveModel ::Serializer ) do
187
+ def json_key
188
+ 'messages'
189
+ end
190
+ end
191
+
186
192
AlternateBlogSerializer = Class . new ( ActiveModel ::Serializer ) do
187
193
attribute :id
188
194
attribute :name , key : :title
You can’t perform that action at this time.
0 commit comments