From 84197e4dad7f03047cd2f2ec9a0d154ebd5c6ef2 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Thu, 24 Mar 2016 21:56:35 -0500 Subject: [PATCH 1/2] SerializableResource handles no serializer like controller --- CHANGELOG.md | 1 + lib/action_controller/serialization.rb | 20 ++++++-------------- lib/active_model/serializable_resource.rb | 10 +++++++++- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 304707bb..b4231093 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Breaking changes: Features: +- [#1616](https://github.com/rails-api/active_model_serializers/pull/1616) SerializableResource handles no serializer like controller. (@bf4) - [#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) diff --git a/lib/action_controller/serialization.rb b/lib/action_controller/serialization.rb index cc7b8ba7..ff21b831 100644 --- a/lib/action_controller/serialization.rb +++ b/lib/action_controller/serialization.rb @@ -33,20 +33,12 @@ module ActionController options[:adapter] = false end serializable_resource = ActiveModel::SerializableResource.new(resource, options) - if serializable_resource.serializer? - serializable_resource.serialization_scope ||= serialization_scope - serializable_resource.serialization_scope_name = _serialization_scope - begin - # Necessary to ensure we have an adapter for the serializable resource - # after it has been figured. - # TODO: This logic should be less opaque and probably moved into the SerializableResource. - serializable_resource.tap(&:adapter) - rescue ActiveModel::Serializer::CollectionSerializer::NoSerializerError - resource - end - else - resource - end + serializable_resource.serialization_scope ||= serialization_scope + serializable_resource.serialization_scope_name = _serialization_scope + # For compatibility with the JSON renderer: `json.to_json(options) if json.is_a?(String)`. + # Otherwise, since `serializable_resource` is not a string, the renderer would call + # `to_json` on a String and given odd results, such as `"".to_json #=> '""'` + serializable_resource.adapter.is_a?(String) ? serializable_resource.adapter : serializable_resource end # Deprecated diff --git a/lib/active_model/serializable_resource.rb b/lib/active_model/serializable_resource.rb index bf0e36f1..b4d962da 100644 --- a/lib/active_model/serializable_resource.rb +++ b/lib/active_model/serializable_resource.rb @@ -30,11 +30,19 @@ module ActiveModel serializer_opts[:scope_name] = scope_name end + # NOTE: if no adapter is available, returns the resource itself. (i.e. adapter is a no-op) def adapter - @adapter ||= ActiveModelSerializers::Adapter.create(serializer_instance, adapter_opts) + @adapter ||= find_adapter end alias adapter_instance adapter + def find_adapter + return resource unless serializer? + ActiveModelSerializers::Adapter.create(serializer_instance, adapter_opts) + rescue ActiveModel::Serializer::CollectionSerializer::NoSerializerError + resource + end + def serializer_instance @serializer_instance ||= serializer.new(resource, serializer_opts) end From ec5dc497b0e029e2da4ad12ad4797f8874b18f16 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Mon, 28 Mar 2016 20:10:55 -0500 Subject: [PATCH 2/2] Handle render.ams with nil serializer or adapter --- lib/active_model/serializer.rb | 1 + lib/active_model/serializer/null.rb | 17 +++++++++++++++++ lib/active_model_serializers/logging.rb | 5 ++++- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 lib/active_model/serializer/null.rb diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 79478abb..e8607845 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -20,6 +20,7 @@ module ActiveModel class Serializer extend ActiveSupport::Autoload autoload :Adapter + autoload :Null include Configuration include Associations include Attributes diff --git a/lib/active_model/serializer/null.rb b/lib/active_model/serializer/null.rb new file mode 100644 index 00000000..818bbbfa --- /dev/null +++ b/lib/active_model/serializer/null.rb @@ -0,0 +1,17 @@ +module ActiveModel + class Serializer + class Null < Serializer + def attributes(*) + {} + end + + def associations(*) + {} + end + + def serializable_hash(*) + {} + end + end + end +end diff --git a/lib/active_model_serializers/logging.rb b/lib/active_model_serializers/logging.rb index 2a859c41..943e937e 100644 --- a/lib/active_model_serializers/logging.rb +++ b/lib/active_model_serializers/logging.rb @@ -81,7 +81,10 @@ module ActiveModelSerializers end def notify_render_payload - { serializer: serializer, adapter: adapter } + { + serializer: serializer || ActiveModel::Serializer::Null, + adapter: adapter || ActiveModelSerializers::Adapter::Null + } end private