From 424b92031b111b93776e0f7c527bacd27c944a8f Mon Sep 17 00:00:00 2001 From: Lucas Hosseini Date: Tue, 7 Jun 2016 20:25:23 +1000 Subject: [PATCH 1/2] Move `root` method from Base to Json. --- lib/active_model_serializers/adapter/base.rb | 4 ---- lib/active_model_serializers/adapter/json.rb | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/active_model_serializers/adapter/base.rb b/lib/active_model_serializers/adapter/base.rb index 7b60db70b..65a44f7fc 100644 --- a/lib/active_model_serializers/adapter/base.rb +++ b/lib/active_model_serializers/adapter/base.rb @@ -74,10 +74,6 @@ def fragment_cache(cached_hash, non_cached_hash) def serialization_options(options) options ||= {} # rubocop:disable Lint/UselessAssignment end - - def root - serializer.json_key.to_sym if serializer.json_key - end end end end diff --git a/lib/active_model_serializers/adapter/json.rb b/lib/active_model_serializers/adapter/json.rb index 423cfb9fb..f32754dd3 100644 --- a/lib/active_model_serializers/adapter/json.rb +++ b/lib/active_model_serializers/adapter/json.rb @@ -9,6 +9,10 @@ def serializable_hash(options = nil) self.class.transform_key_casing!(serialized_hash, instance_options) end + def root + serializer.json_key.to_sym if serializer.json_key + end + def meta instance_options.fetch(:meta, nil) end From bc0234949bf64473fb8a9acabce483aa451665bb Mon Sep 17 00:00:00 2001 From: Lucas Hosseini Date: Tue, 7 Jun 2016 20:37:20 +1000 Subject: [PATCH 2/2] Move handling of `root` option from serializer to adapter. --- lib/active_model/serializer.rb | 10 ++++------ lib/active_model/serializer/collection_serializer.rb | 4 +--- lib/active_model_serializers/adapter/json.rb | 6 +++++- lib/active_model_serializers/serializable_resource.rb | 4 +++- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 570073c72..bb11cf89e 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -19,7 +19,7 @@ module ActiveModel class Serializer # @see #serializable_hash for more details on these valid keys. - SERIALIZABLE_HASH_VALID_KEYS = [:only, :except, :methods, :include, :root].freeze + SERIALIZABLE_HASH_VALID_KEYS = [:only, :except, :methods, :include].freeze extend ActiveSupport::Autoload autoload :Adapter autoload :Null @@ -114,7 +114,7 @@ def self.serialization_adapter_instance @serialization_adapter_instance ||= ActiveModelSerializers::Adapter::Attributes end - attr_accessor :object, :root, :scope + attr_accessor :object, :scope # `scope_name` is set as :current_user by default in the controller. # If the instance does not have a method named `scope_name`, it @@ -122,7 +122,6 @@ def self.serialization_adapter_instance def initialize(object, options = {}) self.object = object self.instance_options = options - self.root = instance_options[:root] self.scope = instance_options[:scope] scope_name = instance_options[:scope_name] @@ -178,8 +177,7 @@ def serializable_hash(adapter_options = nil, options = {}, adapter_instance = se # TODO: When moving attributes adapter logic here, @see #serializable_hash # So that the below is true: # @param options [nil, Hash] The same valid options passed to `as_json` - # (:root, :only, :except, :methods, and :include). - # The default for `root` is nil. + # (:only, :except, :methods, and :include). # The default value for include_root is false. You can change it to true if the given # JSON string includes a single root node. def as_json(adapter_opts = nil) @@ -188,7 +186,7 @@ def as_json(adapter_opts = nil) # Used by adapter as resource root. def json_key - root || _type || object.class.model_name.to_s.underscore + _type || object.class.model_name.to_s.underscore end def read_attribute_for_serialization(attr) diff --git a/lib/active_model/serializer/collection_serializer.rb b/lib/active_model/serializer/collection_serializer.rb index bb84644c5..7a8665143 100644 --- a/lib/active_model/serializer/collection_serializer.rb +++ b/lib/active_model/serializer/collection_serializer.rb @@ -5,12 +5,11 @@ class CollectionSerializer include Enumerable delegate :each, to: :@serializers - attr_reader :object, :root + attr_reader :object def initialize(resources, options = {}) @object = resources @options = options - @root = options[:root] @serializers = serializers_from_resources end @@ -37,7 +36,6 @@ def serializable_hash(adapter_options, options, adapter_instance) # Disabling cop since it's good to highlight the complexity of this method by # including all the logic right here. def json_key - return root if root # 1. get from options[:serializer] for empty resource collection key = object.empty? && (explicit_serializer_class = options[:serializer]) && diff --git a/lib/active_model_serializers/adapter/json.rb b/lib/active_model_serializers/adapter/json.rb index f32754dd3..183fb8f68 100644 --- a/lib/active_model_serializers/adapter/json.rb +++ b/lib/active_model_serializers/adapter/json.rb @@ -10,7 +10,11 @@ def serializable_hash(options = nil) end def root - serializer.json_key.to_sym if serializer.json_key + if instance_options.key?(:root) + instance_options[:root] + elsif serializer.json_key + serializer.json_key.to_sym + end end def meta diff --git a/lib/active_model_serializers/serializable_resource.rb b/lib/active_model_serializers/serializable_resource.rb index 10f9d9aba..9df08d994 100644 --- a/lib/active_model_serializers/serializable_resource.rb +++ b/lib/active_model_serializers/serializable_resource.rb @@ -2,7 +2,9 @@ module ActiveModelSerializers class SerializableResource - ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, :meta_key, :links, :serialization_context, :key_transform]) + ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, + :meta_key, :links, :root, + :serialization_context, :key_transform]) include ActiveModelSerializers::Logging delegate :serializable_hash, :as_json, :to_json, to: :adapter