diff --git a/CHANGELOG.md b/CHANGELOG.md index f900f220d..a66184cfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,9 @@ Breaking changes: Adapter functions. * named `Base` because it's a Rails-ism. * It helps to isolate and highlight what the Adapter interface actually is. +- [#1418](https://github.com/rails-api/active_model_serializers/pull/1418) + serialized collections now use the root option as is; now, only the + root derived from the serializer or object is always pluralized. Features: diff --git a/lib/active_model/serializer/collection_serializer.rb b/lib/active_model/serializer/collection_serializer.rb index a3c9dc476..c1edfeafc 100644 --- a/lib/active_model/serializer/collection_serializer.rb +++ b/lib/active_model/serializer/collection_serializer.rb @@ -23,8 +23,7 @@ def initialize(resources, options = {}) end def json_key - key = root || serializers.first.try(:json_key) || object.try(:name).try(:underscore) - key.try(:pluralize) + root || derived_root end def paginated? @@ -36,6 +35,13 @@ def paginated? protected attr_reader :serializers + + private + + def derived_root + key = serializers.first.try(:json_key) || object.try(:name).try(:underscore) + key.try(:pluralize) + end end end end diff --git a/test/action_controller/serialization_test.rb b/test/action_controller/serialization_test.rb index a3b761981..d2fe3959e 100644 --- a/test/action_controller/serialization_test.rb +++ b/test/action_controller/serialization_test.rb @@ -171,7 +171,7 @@ def test_render_array_using_custom_root with_adapter :json do get :render_array_using_custom_root end - expected = { custom_roots: [{ name: 'Name 1', description: 'Description 1' }] } + expected = { custom_root: [{ name: 'Name 1', description: 'Description 1' }] } assert_equal 'application/json', @response.content_type assert_equal expected.to_json, @response.body end @@ -181,7 +181,7 @@ def test_render_array_that_is_empty_using_custom_root get :render_array_that_is_empty_using_custom_root end - expected = { custom_roots: [] } + expected = { custom_root: [] } assert_equal 'application/json', @response.content_type assert_equal expected.to_json, @response.body end diff --git a/test/collection_serializer_test.rb b/test/collection_serializer_test.rb index 662aa1ee4..a7c0fa021 100644 --- a/test/collection_serializer_test.rb +++ b/test/collection_serializer_test.rb @@ -62,8 +62,9 @@ def test_root_with_no_serializers assert_equal expected, @serializer.root end - def test_json_key - assert_equal 'comments', @serializer.json_key + def test_json_key_with_resource_with_serializer + singular_key = @serializer.send(:serializers).first.json_key + assert_equal singular_key.pluralize, @serializer.json_key end def test_json_key_with_resource_with_name_and_no_serializers @@ -84,13 +85,15 @@ def test_json_key_with_resource_without_name_and_no_serializers end def test_json_key_with_root - serializer = collection_serializer.new(@resource, root: 'custom_root') - assert_equal 'custom_roots', serializer.json_key + expected = 'custom_root' + serializer = collection_serializer.new(@resource, root: expected) + assert_equal expected, serializer.json_key end def test_json_key_with_root_and_no_serializers - serializer = collection_serializer.new(build_named_collection, root: 'custom_root') - assert_equal 'custom_roots', serializer.json_key + expected = 'custom_root' + serializer = collection_serializer.new(build_named_collection, root: expected) + assert_equal expected, serializer.json_key end end end