Skip to content

Commit

Permalink
Include Serializer._type in collection serializer json_key cascade
Browse files Browse the repository at this point in the history
  • Loading branch information
bf4 committed Mar 27, 2016
1 parent 2dd0c33 commit a74d174
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 31 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
Breaking changes:

Features:
- [#1618](https://github.com/rails-api/active_model_serializers/issues/1618) Get collection root key for
empty collection from explicit serializer option, when possible. (@bf4)
- [#1574](https://github.com/rails-api/active_model_serializers/pull/1574) Provide key translation. (@remear)
- [#1494](https://github.com/rails-api/active_model_serializers/pull/1494) Make serializers serializalbe
(using the Attributes adapter by default). (@bf4)
Expand Down
2 changes: 1 addition & 1 deletion lib/active_model/serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ def as_json(adapter_opts = nil)

# Used by adapter as resource root.
def json_key
root || object.class.model_name.to_s.underscore
root || _type || object.class.model_name.to_s.underscore
end

def read_attribute_for_serialization(attr)
Expand Down
48 changes: 24 additions & 24 deletions lib/active_model/serializer/collection_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,10 @@ class CollectionSerializer
attr_reader :object, :root

def initialize(resources, options = {})
@root = options[:root]
@object = resources

@object = resources
@options = options
@root = options[:root]
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_class = options.fetch(:serializer) { serializer_context_class.serializer_for(resource) }

Expand All @@ -32,9 +27,28 @@ def success?
true
end

# TODO: unify naming of root, json_key, and _type. Right now, a serializer's
# json_key comes from the root option or the object's model name, by default.
# But, if a dev defines a custom `json_key` method with an explicit value,
# we have no simple way to know that it is safe to call that instance method.
# (which is really a class property at this point, anyhow).
# rubocop:disable Metrics/CyclomaticComplexity
# Disabling cop since it's good to highlight the complexity of this method by
# including all the logic right here.
def json_key
root || derived_root || guess_root || default_root
return root if root
# 1. get from options[:serializer] for empty resource collection
key = object.empty? &&
(explicit_serializer_class = options[:serializer]) &&
explicit_serializer_class._type
# 2. get from first serializer instance in collection
key ||= (serializer = serializers.first) && serializer.json_key
# 3. get from collection name, if a named collection
key ||= object.respond_to?(:name) ? object.name && object.name.underscore : nil
# 4. key may be nil for empty collection and no serializer option
key && key.pluralize
end
# rubocop:enable Metrics/CyclomaticComplexity

def paginated?
object.respond_to?(:current_page) &&
Expand All @@ -44,21 +58,7 @@ def paginated?

protected

attr_reader :serializers

private

def derived_root
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
attr_reader :serializers, :options
end
end
end
4 changes: 4 additions & 0 deletions test/collection_serializer_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
module ActiveModel
class Serializer
class CollectionSerializerTest < ActiveSupport::TestCase
MessagesSerializer = Class.new(ActiveModel::Serializer) do
type 'messages'
end

def setup
@comment = Comment.new
@post = Post.new
Expand Down
6 changes: 0 additions & 6 deletions test/fixtures/poro.rb
Original file line number Diff line number Diff line change
Expand Up @@ -183,12 +183,6 @@ def json_key
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
Expand Down

0 comments on commit a74d174

Please sign in to comment.