diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 32c3be2e..5a4f1713 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -274,6 +274,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/serialization_test.rb b/test/serialization_test.rb index 538101f7..936ee113 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 "{\"dummy_custom\":null}", @response.body + end + def test_render_json get :render_json_hello_world assert_equal '{"hello":"world"}', @response.body diff --git a/test/serializer_test.rb b/test/serializer_test.rb index de18c160..d51d8a17 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -276,6 +276,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