File tree Expand file tree Collapse file tree 3 files changed +29
-4
lines changed
lib/active_model/serializer Expand file tree Collapse file tree 3 files changed +29
-4
lines changed Original file line number Diff line number Diff line change @@ -10,8 +10,14 @@ class CollectionSerializer
1010 def initialize ( resources , options = { } )
1111 @root = options [ :root ]
1212 @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+
1320 @serializers = resources . map do |resource |
14- serializer_context_class = options . fetch ( :serializer_context_class , ActiveModel ::Serializer )
1521 serializer_class = options . fetch ( :serializer ) { serializer_context_class . serializer_for ( resource ) }
1622
1723 if serializer_class . nil? # rubocop:disable Style/GuardClause
@@ -27,7 +33,7 @@ def success?
2733 end
2834
2935 def json_key
30- root || derived_root
36+ root || derived_root || guess_root || default_root
3137 end
3238
3339 def paginated?
@@ -43,8 +49,15 @@ def paginated?
4349 private
4450
4551 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 )
4861 end
4962 end
5063 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
8484 assert_nil serializer . json_key
8585 end
8686
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+
8793 def test_json_key_with_root
8894 expected = 'custom_root'
8995 serializer = collection_serializer . new ( @resource , root : expected )
Original file line number Diff line number Diff line change @@ -183,6 +183,12 @@ def json_key
183183 end
184184end
185185
186+ MessagesSerializer = Class . new ( ActiveModel ::Serializer ) do
187+ def json_key
188+ 'messages'
189+ end
190+ end
191+
186192AlternateBlogSerializer = Class . new ( ActiveModel ::Serializer ) do
187193 attribute :id
188194 attribute :name , key : :title
You can’t perform that action at this time.
0 commit comments