From 6f3b250dc99c0e8780f93a6c416ebfe3e5d0bfcd Mon Sep 17 00:00:00 2001 From: twinturbo Date: Mon, 16 Jul 2012 15:08:01 +0200 Subject: [PATCH] Don't include empty polymoprhic associations Take this serializer: class TodoSerializer < ActiveModel::Serializer root :todo, :include => true has_one :reference, :polymorphic => true end A nil reference would generate this JSON: { "todo": { "reference": null }, "nil_classes": [] } This commit prevents the `nil_classes` key from being added when serializing and including nil polymoprhic associations. --- lib/active_model/serializer.rb | 14 +++++++++++++- test/serializer_test.rb | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index af2ec277..117b89de 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -194,6 +194,10 @@ module ActiveModel option(:include, source_serializer._root_embed) end + def embeddable? + !associated_object.nil? + end + protected def find_serializable(object) @@ -228,6 +232,14 @@ module ActiveModel end class HasOne < Config #:nodoc: + def embeddable? + if polymorphic? && associated_object.nil? + false + else + true + end + end + def polymorphic? option :polymorphic end @@ -516,7 +528,7 @@ module ActiveModel if association.embed_in_root? && hash.nil? raise IncludeError.new(self.class, association.name) - elsif association.embed_in_root? + elsif association.embed_in_root? && association.embeddable? merge_association hash, association.root, association.serialize_many, unique_values end elsif association.embed_objects? diff --git a/test/serializer_test.rb b/test/serializer_test.rb index 3e269be8..b785e3b6 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -1244,4 +1244,24 @@ class SerializerTest < ActiveModel::TestCase smoothie.as_json end end + + def tests_includes_does_not_include_nil_polymoprhic_associations + post_serializer = Class.new(ActiveModel::Serializer) do + root :post + embed :ids, :include => true + has_one :author, :polymorphic => true + attributes :title + end + + post = Post.new(:title => 'Foo') + + actual = post_serializer.new(post).as_json + + assert_equal({ + :post => { + :title => 'Foo', + :author => nil + } + }, actual) + end end