diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 15f24523..a7701578 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -31,7 +31,8 @@ module ActiveModel serializer = item.active_model_serializer end - serializable = serializer ? serializer.new(item, @options) : item + serializable = serializer ? serializer.new(item, @options) + : DefaultSerializer.new(item) if serializable.respond_to?(:serializable_hash) serializable.serializable_hash diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 5a4f1713..4ef0a112 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -395,4 +395,20 @@ module ActiveModel ActiveSupport::Notifications.instrument(event_name, payload, &block) end end + + # DefaultSerializer + # + # Provides a constant interface for all items, particularly + # for ArraySerializer. + class DefaultSerializer + attr_reader :object, :options + + def initialize(object, options={}) + @object, @options = object, options + end + + def serializable_hash + @object.as_json + end + end end diff --git a/test/array_serializer_test.rb b/test/array_serializer_test.rb index 152defc2..d3001ac1 100644 --- a/test/array_serializer_test.rb +++ b/test/array_serializer_test.rb @@ -51,5 +51,4 @@ class ArraySerializerTest < ActiveModel::TestCase { :title => "Post2" } ], serializer.as_json) end - end