From f4c8a4b71fcce46c3259240b50f30e134e14c4a2 Mon Sep 17 00:00:00 2001 From: Godfrey Chan Date: Mon, 14 Jul 2014 10:38:14 -0700 Subject: Merge pull request #16162 from chancancode/fix_json_coder Fixed JSON coder when loading NULL from DB --- activerecord/lib/active_record/coders/json.rb | 2 +- activerecord/test/cases/serialized_attribute_test.rb | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/coders/json.rb b/activerecord/lib/active_record/coders/json.rb index 0f60b6dab2..75d3bfe625 100644 --- a/activerecord/lib/active_record/coders/json.rb +++ b/activerecord/lib/active_record/coders/json.rb @@ -6,7 +6,7 @@ module ActiveRecord end def self.load(json) - ActiveSupport::JSON.decode(json) + ActiveSupport::JSON.decode(json) unless json.nil? end end end diff --git a/activerecord/test/cases/serialized_attribute_test.rb b/activerecord/test/cases/serialized_attribute_test.rb index a8f667c732..96d1e365f0 100644 --- a/activerecord/test/cases/serialized_attribute_test.rb +++ b/activerecord/test/cases/serialized_attribute_test.rb @@ -81,6 +81,24 @@ class SerializedAttributeTest < ActiveRecord::TestCase assert_equal(my_post.title, t.content["title"]) end + # This is to ensure that the JSON coder is behaving the same way as 4.0, but + # we can consider changing this in the future. + def test_json_db_null + Topic.serialize :content, JSON + + # Force a row to have a database NULL instead of a JSON "null" + id = Topic.connection.insert "INSERT INTO topics (content) VALUES(NULL)" + t = Topic.find(id) + + assert_nil t.content + + t.save! + + # On 4.0, re-saving a row with a database NULL will turn that into a JSON + # "null" + assert_equal 1, Topic.where('content = "null"').count + end + def test_serialized_attribute_declared_in_subclass hash = { 'important1' => 'value1', 'important2' => 'value2' } important_topic = ImportantTopic.create("important" => hash) -- cgit v1.2.3