Don't pluralize the CollectionSerializer#root for #json_key

One of three constituents is used to provide the
CollectionSerializer's #json_key:

1) the :root option - controlled by the caller
2) the #name of the first resource serializer - the root or
   underscored model name
3) the underscored #name of the resources object - generally
   equivalent to the underscored model name of #2

Of the three, only the latter 2 are out of the callers control, and
only the latter two are expected to be singular by default. Not
pluralizing the root gives the caller additional flexibility in
defining the desired root, whether conventionally plural,
unconventionally plural (e.g. objects_received:) or singular.
This commit is contained in:
Ben Woosley 2016-01-07 11:32:10 -08:00
parent 34e5faa1c4
commit 251e33a0a1
4 changed files with 22 additions and 10 deletions

View File

@ -13,6 +13,9 @@ Breaking changes:
Adapter functions. Adapter functions.
* named `Base` because it's a Rails-ism. * named `Base` because it's a Rails-ism.
* It helps to isolate and highlight what the Adapter interface actually is. * 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: Features:

View File

@ -23,8 +23,7 @@ module ActiveModel
end end
def json_key def json_key
key = root || serializers.first.try(:json_key) || object.try(:name).try(:underscore) root || derived_root
key.try(:pluralize)
end end
def paginated? def paginated?
@ -36,6 +35,13 @@ module ActiveModel
protected protected
attr_reader :serializers 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 end
end end

View File

@ -171,7 +171,7 @@ module ActionController
with_adapter :json do with_adapter :json do
get :render_array_using_custom_root get :render_array_using_custom_root
end 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 'application/json', @response.content_type
assert_equal expected.to_json, @response.body assert_equal expected.to_json, @response.body
end end
@ -181,7 +181,7 @@ module ActionController
get :render_array_that_is_empty_using_custom_root get :render_array_that_is_empty_using_custom_root
end end
expected = { custom_roots: [] } expected = { custom_root: [] }
assert_equal 'application/json', @response.content_type assert_equal 'application/json', @response.content_type
assert_equal expected.to_json, @response.body assert_equal expected.to_json, @response.body
end end

View File

@ -62,8 +62,9 @@ module ActiveModel
assert_equal expected, @serializer.root assert_equal expected, @serializer.root
end end
def test_json_key def test_json_key_with_resource_with_serializer
assert_equal 'comments', @serializer.json_key singular_key = @serializer.send(:serializers).first.json_key
assert_equal singular_key.pluralize, @serializer.json_key
end end
def test_json_key_with_resource_with_name_and_no_serializers def test_json_key_with_resource_with_name_and_no_serializers
@ -84,13 +85,15 @@ module ActiveModel
end end
def test_json_key_with_root def test_json_key_with_root
serializer = collection_serializer.new(@resource, root: 'custom_root') expected = 'custom_root'
assert_equal 'custom_roots', serializer.json_key serializer = collection_serializer.new(@resource, root: expected)
assert_equal expected, serializer.json_key
end end
def test_json_key_with_root_and_no_serializers def test_json_key_with_root_and_no_serializers
serializer = collection_serializer.new(build_named_collection, root: 'custom_root') expected = 'custom_root'
assert_equal 'custom_roots', serializer.json_key serializer = collection_serializer.new(build_named_collection, root: expected)
assert_equal expected, serializer.json_key
end end
end end
end end