From d35999a7eec185f6b334bd3a4e3e3c4dd8464f15 Mon Sep 17 00:00:00 2001 From: Lee Mallabone Date: Wed, 6 Feb 2013 17:32:15 -0800 Subject: [PATCH 1/3] Add failing test to show behavior of custom serializer with nils. --- test/serialization_test.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/serialization_test.rb b/test/serialization_test.rb index 538101f7..06c531eb 100644 --- a/test/serialization_test.rb +++ b/test/serialization_test.rb @@ -63,6 +63,10 @@ class RenderJsonTest < ActionController::TestCase end end + class DummyCustomSerializer < ActiveModel::Serializer + attributes :id + end + class HypermediaSerializable def active_model_serializer HypermediaSerializer @@ -117,6 +121,11 @@ class RenderJsonTest < ActionController::TestCase render :json => ActiveSupport::JSON.encode(:hello => 'world') end + def render_json_nil_with_custom_serializer + render :json => nil, :serializer => DummyCustomSerializer + end + + def render_json_with_extra_options render :json => JsonRenderable.new, :except => [:c, :e] end @@ -216,6 +225,11 @@ class RenderJsonTest < ActionController::TestCase assert_equal '[]', @response.body end + def test_render_json_nil_with_custom_serializer + get :render_json_nil_with_custom_serializer + assert_equal 'null', @response.body + end + def test_render_json get :render_json_hello_world assert_equal '{"hello":"world"}', @response.body From 58a063eff0979a52043de057887b585394d0fc85 Mon Sep 17 00:00:00 2001 From: Michi Huber Date: Tue, 26 Feb 2013 11:12:28 +0100 Subject: [PATCH 2/3] serialization test: respect root settings when root object is nil --- test/serialization_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/serialization_test.rb b/test/serialization_test.rb index 06c531eb..936ee113 100644 --- a/test/serialization_test.rb +++ b/test/serialization_test.rb @@ -227,7 +227,7 @@ class RenderJsonTest < ActionController::TestCase def test_render_json_nil_with_custom_serializer get :render_json_nil_with_custom_serializer - assert_equal 'null', @response.body + assert_equal "{\"dummy_custom\":null}", @response.body end def test_render_json From c7a420d29574c135e4b5d91d81af34bbdc23eade Mon Sep 17 00:00:00 2001 From: Michi Huber Date: Tue, 26 Feb 2013 11:17:28 +0100 Subject: [PATCH 3/3] Don't fail if object is nil, render null --- lib/active_model/serializer.rb | 1 + test/serializer_test.rb | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index b070664c..5cec7187 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -267,6 +267,7 @@ module ActiveModel # Returns a hash representation of the serializable # object without the root. def serializable_hash + return nil if @object.nil? instrument(:serialize, :serializer => self.class.name) do @node = attributes instrument :associations do diff --git a/test/serializer_test.rb b/test/serializer_test.rb index 9fe10e64..04b3742f 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -254,6 +254,28 @@ class SerializerTest < ActiveModel::TestCase assert_equal({ :my_blog => { :author => nil } }, serializer.new(blog, :scope => user).as_json) end + def test_nil_root_object + user = User.new + blog = nil + + serializer = Class.new(BlogSerializer) do + root false + end + + assert_equal(nil, serializer.new(blog, :scope => user).as_json) + end + + def test_custom_root_with_nil_root_object + user = User.new + blog = nil + + serializer = Class.new(BlogSerializer) do + root :my_blog + end + + assert_equal({ :my_blog => nil }, serializer.new(blog, :scope => user).as_json) + end + def test_false_root user = User.new blog = Blog.new