diff --git a/lib/active_model/default_serializer.rb b/lib/active_model/default_serializer.rb index 270ef061..5ab78c3b 100644 --- a/lib/active_model/default_serializer.rb +++ b/lib/active_model/default_serializer.rb @@ -9,12 +9,15 @@ module ActiveModel attr_reader :object - def initialize(object, options=nil) + def initialize(object, options={}) @object = object + @wrap_in_array = options[:_wrap_in_array] end def as_json(options={}) - @object.as_json + return [] if @object.nil? && @wrap_in_array + hash = @object.as_json + @wrap_in_array ? [hash] : hash end alias serializable_hash as_json alias serializable_object as_json diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index fba7fffa..a66f6953 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -183,7 +183,7 @@ end end def serializable_object(options={}) - return nil if object.nil? + return @wrap_in_array ? [] : nil if @object.nil? hash = attributes hash.merge! associations @wrap_in_array ? [hash] : hash diff --git a/test/unit/active_model/serializer/has_one_test.rb b/test/unit/active_model/serializer/has_one_test.rb index fbe1e12d..2d49aa77 100644 --- a/test/unit/active_model/serializer/has_one_test.rb +++ b/test/unit/active_model/serializer/has_one_test.rb @@ -106,6 +106,21 @@ module ActiveModel }, @user_serializer.serializable_hash) end + def test_associations_embedding_nil_ids_including_objects_serialization_using_as_json + @association.embed = :ids + @association.embed_in_root = true + @user.instance_eval do + def profile + nil + end + end + + assert_equal({ + 'user' => { name: 'Name 1', email: 'mail@server.com', 'profile_id' => nil }, + 'profiles' => [] + }, @user_serializer.as_json) + end + def test_associations_embedding_ids_including_objects_serialization_using_as_json @association.embed = :ids @association.embed_in_root = true