diff --git a/lib/action_controller/serialization.rb b/lib/action_controller/serialization.rb index a659c8d7..acafc0fd 100644 --- a/lib/action_controller/serialization.rb +++ b/lib/action_controller/serialization.rb @@ -43,10 +43,10 @@ module ActionController @_serializer_opts[:scope_name] = _serialization_scope begin - object = serializer.new(resource, @_serializer_opts) - rescue ActiveModel::Serializer::ArraySerializer::Error + serialized = serializer.new(resource, @_serializer_opts) + rescue ActiveModel::Serializer::ArraySerializer::NoSerializerError else - resource = ActiveModel::Serializer::Adapter.create(object, @_adapter_opts) + resource = ActiveModel::Serializer::Adapter.create(serialized, @_adapter_opts) end end diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 8594d14e..7e4eb0d6 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -211,13 +211,7 @@ module ActiveModel association_value, options.except(:serializer).merge(serializer_from_options(association_options)) ) - rescue ActiveModel::Serializer::ArraySerializer::Error - # 1. Failure to serialize an element in a collection, e.g. [ {hi: "Steve" } ] will fail - # with NoMethodError when the ArraySerializer finds no serializer for the hash { hi: "Steve" }, - # and tries to call new on that nil. - # 2. Convert association_value to hash using implicit as_json - # 3. Set as virtual value (serializer is nil) - # 4. Consider warning when this happens + rescue ActiveModel::Serializer::ArraySerializer::NoSerializerError virtual_value = association_value virtual_value = virtual_value.as_json if virtual_value.respond_to?(:as_json) association_options[:association_options][:virtual_value] = virtual_value diff --git a/lib/active_model/serializer/array_serializer.rb b/lib/active_model/serializer/array_serializer.rb index bd73fd9e..fa66e290 100644 --- a/lib/active_model/serializer/array_serializer.rb +++ b/lib/active_model/serializer/array_serializer.rb @@ -1,11 +1,11 @@ module ActiveModel class Serializer class ArraySerializer - Error = Class.new(StandardError) + NoSerializerError = Class.new(StandardError) include Enumerable delegate :each, to: :@objects - attr_reader :meta, :meta_key, :objects + attr_reader :meta, :meta_key def initialize(objects, options = {}) @resource = objects @@ -16,7 +16,7 @@ module ActiveModel ) if serializer_class.nil? - fail Error, "No serializer found for object: #{object.inspect}" + fail NoSerializerError, "No serializer found for object: #{object.inspect}" else serializer_class.new(object, options.except(:serializer)) end