Skip to content

Commit

Permalink
Don't pluralize the CollectionSerializer#root for #json_key
Browse files Browse the repository at this point in the history
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 rails-api#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.
  • Loading branch information
Empact committed Jan 12, 2016
1 parent 34e5faa commit 1989498
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 10 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ 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)
When generating a collection serialization's `json_key`, the `root:`
option is no longer pluralized. This enables you to generate any
`json_key` for a collection, rather than just ones which are the
result of `pluralize`.

Features:

Expand Down
7 changes: 5 additions & 2 deletions lib/active_model/serializer/collection_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,11 @@ def initialize(resources, options = {})
end

def json_key
key = root || serializers.first.try(:json_key) || object.try(:name).try(:underscore)
key.try(:pluralize)
root || begin
singular_key = serializers.first.try(:json_key) ||
object.try(:name).try(:underscore)
singular_key.try(:pluralize)
end
end

def paginated?
Expand Down
4 changes: 2 additions & 2 deletions test/action_controller/serialization_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
15 changes: 9 additions & 6 deletions test/collection_serializer_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit 1989498

Please sign in to comment.