diff options
author | Johannes Opper <johannes.opper@gmail.com> | 2016-02-22 17:36:08 +0100 |
---|---|---|
committer | Johannes Opper <johannes.opper@gmail.com> | 2016-02-22 17:59:51 +0100 |
commit | 894facb1967c9f394be92ec699e4eafddc2aea52 (patch) | |
tree | 55fddad68c50a6e15e16ffb21702003e28e0e8ea /activerecord | |
parent | aa3d4408716a2470f85d8e0443cbc7a4ce1ff53d (diff) | |
download | rails-894facb1967c9f394be92ec699e4eafddc2aea52.tar.gz rails-894facb1967c9f394be92ec699e4eafddc2aea52.tar.bz2 rails-894facb1967c9f394be92ec699e4eafddc2aea52.zip |
Fix bug in JSON deserialization when column default is an empty string
When `ActiveRecord::Coders::JSON` serialization is used and the default of the column returns `''` it raises the following error:
```
JSON::ParserError: A JSON text must at least contain two octets!
```
If MySQL is running in non-strict mode, it returns an empty string as column default for a text column:
```ruby
def extract_default
if blob_or_text_column?
@default = null || strict ? nil : ''
end
end
```
Since `''` is invalid JSON, there shouldn't be an attempt to parse it, it should be treated like nil.
ActiveRecord::Coders::JSON should behave consistently for all possible non-user-set column default values.
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/CHANGELOG.md | 5 | ||||
-rw-r--r-- | activerecord/lib/active_record/coders/json.rb | 2 | ||||
-rw-r--r-- | activerecord/test/cases/coders/json_test.rb | 15 |
3 files changed, 21 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index c18403865f..d384aba9c1 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,8 @@ +* Handle JSON deserialization correctly if the column default from database + adapter returns `''` instead of `nil`. + + *Johannes Opper* + * Ensure that mutations of the array returned from `ActiveRecord::Relation#to_a` do not affect the original relation, by returning a duplicate array each time. diff --git a/activerecord/lib/active_record/coders/json.rb b/activerecord/lib/active_record/coders/json.rb index 75d3bfe625..cb185a881e 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) unless json.nil? + ActiveSupport::JSON.decode(json) unless json.blank? end end end diff --git a/activerecord/test/cases/coders/json_test.rb b/activerecord/test/cases/coders/json_test.rb new file mode 100644 index 0000000000..d22d93d129 --- /dev/null +++ b/activerecord/test/cases/coders/json_test.rb @@ -0,0 +1,15 @@ +require "cases/helper" + +module ActiveRecord + module Coders + class JSONTest < ActiveRecord::TestCase + def test_returns_nil_if_empty_string_given + assert_nil JSON.load("") + end + + def test_returns_nil_if_nil_given + assert_nil JSON.load(nil) + end + end + end +end |