Skip to content

Commit 2dd0c33

Browse files
Roman Kapitonovbf4
Roman Kapitonov
authored andcommitted
[FIX] Fetch json key from item serializer if empty collection is passed to collection serializer and each_searializer is specified.
1 parent 33a0f9c commit 2dd0c33

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

lib/active_model/serializer/collection_serializer.rb

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff 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

test/collection_serializer_test.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff 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)

test/fixtures/poro.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,12 @@ def json_key
183183
end
184184
end
185185

186+
MessagesSerializer = Class.new(ActiveModel::Serializer) do
187+
def json_key
188+
'messages'
189+
end
190+
end
191+
186192
AlternateBlogSerializer = Class.new(ActiveModel::Serializer) do
187193
attribute :id
188194
attribute :name, key: :title

0 commit comments

Comments
 (0)