From 09bb41fbdb8bb7d4cf414d90f43e324908fac801 Mon Sep 17 00:00:00 2001 From: adman65 Date: Tue, 3 Jan 2012 13:37:39 +0200 Subject: [PATCH] Add test cases for nil polymorphic associations --- lib/active_model/serializer.rb | 4 +++- test/serializer_test.rb | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index d59abc58..fbbfe9da 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -131,10 +131,12 @@ module ActiveModel def serialize_ids(object, scope) - if polymorphic? + if polymorphic? && object { polymorphic_key(object) => object.read_attribute_for_serialization(:id), } + elsif polymorphic? && !object + { } elsif object { key => object.read_attribute_for_serialization(:id) } else diff --git a/test/serializer_test.rb b/test/serializer_test.rb index d502b226..f8ef7d1a 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -667,6 +667,25 @@ class SerializerTest < ActiveModel::TestCase }, serializer.as_json) end + def test_polymorphic_has_one_with_nil + polymorphic_blog = Class.new do + attr_accessor :writer + end + + polymorphic_serializer = Class.new(ActiveModel::Serializer) do + has_one :writer, :polymorphic => true + end + + user = PolymorphicUser.new + blog = polymorphic_blog.new + blog.writer = nil + + serializer = polymorphic_serializer.new(blog, user) + + assert_equal({ + }, serializer.as_json) + end + def test_polymorphic_has_one_with_ids polymorphic_blog = Class.new do attr_accessor :writer @@ -688,6 +707,26 @@ class SerializerTest < ActiveModel::TestCase }, serializer.as_json) end + def test_polymorphic_has_one_id_with_nil + polymorphic_blog = Class.new do + attr_accessor :writer + end + + polymorphic_serializer = Class.new(ActiveModel::Serializer) do + embed :ids + has_one :writer, :polymorphic => true + end + + user = PolymorphicUser.new + blog = polymorphic_blog.new + blog.writer = nil + + serializer = polymorphic_serializer.new(blog, user) + + assert_equal({ + }, serializer.as_json) + end + def test_root_provided_in_options author_serializer = Class.new(ActiveModel::Serializer) do attributes :id, :name