diff options
author | José Valim <jose.valim@gmail.com> | 2010-06-26 11:57:43 +0200 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2010-06-26 12:01:13 +0200 |
commit | 7bd85a8fc2d216a5e2b1d0380df572f782a54d1c (patch) | |
tree | 0e9a1b63353b01244bce81bb7262bfb87e92b997 /activemodel | |
parent | cfaaed3f40e820d2b4d60c2d8bc1f9a005cee086 (diff) | |
download | rails-7bd85a8fc2d216a5e2b1d0380df572f782a54d1c.tar.gz rails-7bd85a8fc2d216a5e2b1d0380df572f782a54d1c.tar.bz2 rails-7bd85a8fc2d216a5e2b1d0380df572f782a54d1c.zip |
Work around the fact the JSON gem was overwriting to_json implementation for all Ruby core classes.
This is required because the JSON gem is incompatible with Rails behavior and was not allowing ActiveModel::Errors to be serialized.
So we need to ensure Rails implementation is the one triggered. [#4890 state:resolved]
Diffstat (limited to 'activemodel')
-rw-r--r-- | activemodel/lib/active_model/errors.rb | 17 | ||||
-rw-r--r-- | activemodel/test/cases/validations/presence_validation_test.rb | 2 | ||||
-rw-r--r-- | activemodel/test/cases/validations_test.rb | 21 |
3 files changed, 23 insertions, 17 deletions
diff --git a/activemodel/lib/active_model/errors.rb b/activemodel/lib/active_model/errors.rb index ae7822d8d5..d42fc5291d 100644 --- a/activemodel/lib/active_model/errors.rb +++ b/activemodel/lib/active_model/errors.rb @@ -3,6 +3,7 @@ require 'active_support/core_ext/array/wrap' require 'active_support/core_ext/string/inflections' require 'active_support/core_ext/object/blank' +require 'active_support/core_ext/hash/reverse_merge' require 'active_support/ordered_hash' module ActiveModel @@ -164,15 +165,12 @@ module ActiveModel # # <error>name must be specified</error> # # </errors> def to_xml(options={}) - require 'builder' unless defined? ::Builder - options[:root] ||= "errors" - options[:indent] ||= 2 - options[:builder] ||= ::Builder::XmlMarkup.new(:indent => options[:indent]) - - options[:builder].instruct! unless options.delete(:skip_instruct) - options[:builder].errors do |e| - to_a.each { |error| e.error(error) } - end + to_a.to_xml options.reverse_merge(:root => "errors", :skip_types => true) + end + + # Returns an array as JSON representation for this object. + def as_json(options=nil) + to_a end # Adds +message+ to the error messages on +attribute+, which will be returned on a call to @@ -283,7 +281,6 @@ module ActiveModel # <li><tt>errors.attributes.title.blank</tt></li> # <li><tt>errors.messages.blank</tt></li> # </ol> - def generate_message(attribute, type = :invalid, options = {}) type = options.delete(:message) if options[:message].is_a?(Symbol) diff --git a/activemodel/test/cases/validations/presence_validation_test.rb b/activemodel/test/cases/validations/presence_validation_test.rb index b1450586a8..510c13a7c3 100644 --- a/activemodel/test/cases/validations/presence_validation_test.rb +++ b/activemodel/test/cases/validations/presence_validation_test.rb @@ -32,7 +32,7 @@ class PresenceValidationTest < ActiveModel::TestCase assert t.valid? end - test 'accepts array arguments' do + def test_accepts_array_arguments Topic.validates_presence_of %w(title content) t = Topic.new assert t.invalid? diff --git a/activemodel/test/cases/validations_test.rb b/activemodel/test/cases/validations_test.rb index 228c1c074f..e94d8ce88c 100644 --- a/activemodel/test/cases/validations_test.rb +++ b/activemodel/test/cases/validations_test.rb @@ -6,6 +6,9 @@ require 'models/reply' require 'models/custom_reader' require 'models/automobile' +require 'active_support/json' +require 'active_support/xml_mini' + class ValidationsTest < ActiveModel::TestCase def setup @@ -158,12 +161,18 @@ class ValidationsTest < ActiveModel::TestCase end end - def test_errors_to_xml - r = Reply.new :title => "Wrong Create" - assert r.invalid? - xml = r.errors.to_xml(:skip_instruct => true) - assert_equal "<errors>", xml.first(8) - assert xml.include?("<error>Content is Empty</error>") + def test_errors_conversions + Topic.validates_presence_of %w(title content) + t = Topic.new + assert t.invalid? + + xml = t.errors.to_xml + assert_match %r{<errors>}, xml + assert_match %r{<error>Title can't be blank</error>}, xml + assert_match %r{<error>Content can't be blank</error>}, xml + + json = t.errors.to_json + assert_equal t.errors.to_a.to_json, json end def test_validation_order |