Skip to content

Commit e5d1e40

Browse files
bf4joaomdmoura
authored andcommitted
Handle special-case of Array serializer with unserializable elements
1 parent cf77786 commit e5d1e40

File tree

3 files changed

+8
-6
lines changed

3 files changed

+8
-6
lines changed

lib/action_controller/serialization.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,9 @@ def use_adapter?
4242
@_serializer_opts[:scope] ||= serialization_scope
4343
@_serializer_opts[:scope_name] = _serialization_scope
4444

45-
object = serializer.new(resource, @_serializer_opts)
46-
47-
if serializer == ActiveModel::Serializer.config.array_serializer
48-
resource = ActiveModel::Serializer::Adapter.create(object, @_adapter_opts) unless object.objects.all? {|i| i.nil?}
45+
begin
46+
object = serializer.new(resource, @_serializer_opts)
47+
rescue ActiveModel::Serializer::ArraySerializer::Error
4948
else
5049
resource = ActiveModel::Serializer::Adapter.create(object, @_adapter_opts)
5150
end

lib/active_model/serializer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ def each_association(&block)
211211
association_value,
212212
options.except(:serializer).merge(serializer_from_options(association_options))
213213
)
214-
rescue NoMethodError
214+
rescue ActiveModel::Serializer::ArraySerializer::Error
215215
# 1. Failure to serialize an element in a collection, e.g. [ {hi: "Steve" } ] will fail
216216
# with NoMethodError when the ArraySerializer finds no serializer for the hash { hi: "Steve" },
217217
# and tries to call new on that nil.

lib/active_model/serializer/array_serializer.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module ActiveModel
22
class Serializer
33
class ArraySerializer
4+
Error = Class.new(StandardError)
45
include Enumerable
56
delegate :each, to: :@objects
67

@@ -14,7 +15,9 @@ def initialize(objects, options = {})
1415
ActiveModel::Serializer.serializer_for(object)
1516
)
1617

17-
unless serializer_class.nil?
18+
if serializer_class.nil?
19+
fail Error, "No serializer found for object: #{object.inspect}"
20+
else
1821
serializer_class.new(object, options.except(:serializer))
1922
end
2023
end

0 commit comments

Comments
 (0)