From 2dd0c334616e208116f8dd5d047d9d23c8b1bc83 Mon Sep 17 00:00:00 2001 From: Roman Kapitonov Date: Wed, 24 Feb 2016 21:03:36 +0300 Subject: [PATCH] [FIX] Fetch json key from item serializer if empty collection is passed to collection serializer and each_searializer is specified. --- .../serializer/collection_serializer.rb | 21 +++++++++++++++---- test/collection_serializer_test.rb | 6 ++++++ test/fixtures/poro.rb | 6 ++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/lib/active_model/serializer/collection_serializer.rb b/lib/active_model/serializer/collection_serializer.rb index 7862e994..ebaded3d 100644 --- a/lib/active_model/serializer/collection_serializer.rb +++ b/lib/active_model/serializer/collection_serializer.rb @@ -10,8 +10,14 @@ module ActiveModel def initialize(resources, options = {}) @root = options[:root] @object = resources + + serializer_context_class = options.fetch(:serializer_context_class, ActiveModel::Serializer) + + if resources.blank? && options[:serializer] + @each_serializer = options[:serializer] + end + @serializers = resources.map do |resource| - serializer_context_class = options.fetch(:serializer_context_class, ActiveModel::Serializer) serializer_class = options.fetch(:serializer) { serializer_context_class.serializer_for(resource) } if serializer_class.nil? # rubocop:disable Style/GuardClause @@ -27,7 +33,7 @@ module ActiveModel end def json_key - root || derived_root + root || derived_root || guess_root || default_root end def paginated? @@ -43,8 +49,15 @@ module ActiveModel private def derived_root - key = serializers.first.try(:json_key) || object.try(:name).try(:underscore) - key.try(:pluralize) + serializers.first.try(:json_key).try(:pluralize) + end + + def default_root + object.try(:name).try(:underscore).try(:pluralize) + end + + def guess_root + @each_serializer.try(:allocate).try(:json_key).try(:pluralize) end end end diff --git a/test/collection_serializer_test.rb b/test/collection_serializer_test.rb index a7c0fa02..833867b0 100644 --- a/test/collection_serializer_test.rb +++ b/test/collection_serializer_test.rb @@ -84,6 +84,12 @@ module ActiveModel assert_nil serializer.json_key end + def test_json_key_with_empty_resources_with_serializer + resource = [] + serializer = collection_serializer.new(resource, serializer: MessagesSerializer) + assert_equal 'messages', serializer.json_key + end + def test_json_key_with_root expected = 'custom_root' serializer = collection_serializer.new(@resource, root: expected) diff --git a/test/fixtures/poro.rb b/test/fixtures/poro.rb index c7fb831c..7fc59ffa 100644 --- a/test/fixtures/poro.rb +++ b/test/fixtures/poro.rb @@ -183,6 +183,12 @@ PaginatedSerializer = Class.new(ActiveModel::Serializer::CollectionSerializer) d end end +MessagesSerializer = Class.new(ActiveModel::Serializer) do + def json_key + 'messages' + end +end + AlternateBlogSerializer = Class.new(ActiveModel::Serializer) do attribute :id attribute :name, key: :title