diff options
-rw-r--r-- | activemodel/CHANGELOG.md | 5 | ||||
-rw-r--r-- | activemodel/lib/active_model/validations/presence.rb | 6 | ||||
-rw-r--r-- | activemodel/test/cases/validations/presence_validation_test.rb | 34 |
3 files changed, 42 insertions, 3 deletions
diff --git a/activemodel/CHANGELOG.md b/activemodel/CHANGELOG.md index d98df4cb91..7dfc76ea8f 100644 --- a/activemodel/CHANGELOG.md +++ b/activemodel/CHANGELOG.md @@ -1,5 +1,10 @@ ## Rails 3.2.10 (unreleased) ## +* Fix `validates_presence_of` with `:allow_nil` or `:allow_blank` options. + Fixes #8621. + + *Colin Kelley and Rafael Mendonça França* + * Specify type of singular association during serialization *Steve Klabnik* diff --git a/activemodel/lib/active_model/validations/presence.rb b/activemodel/lib/active_model/validations/presence.rb index efd1372a6b..20a57e3c59 100644 --- a/activemodel/lib/active_model/validations/presence.rb +++ b/activemodel/lib/active_model/validations/presence.rb @@ -4,8 +4,8 @@ module ActiveModel # == Active Model Presence Validator module Validations class PresenceValidator < EachValidator - def validate(record) - record.errors.add_on_blank(attributes, options) + def validate_each(record, attr_name, value) + record.errors.add(attr_name, :blank, options) if value.blank? end end @@ -39,7 +39,7 @@ module ActiveModel # if the validation should not occur (e.g. <tt>:unless => :skip_validation</tt>, # or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The method, # proc or string should return or evaluate to a true or false value. - # * <tt>:strict</tt> - Specifies whether validation should be strict. + # * <tt>:strict</tt> - Specifies whether validation should be strict. # See <tt>ActiveModel::Validation#validates!</tt> for more information. def validates_presence_of(*attr_names) validates_with PresenceValidator, _merge_attributes(attr_names) diff --git a/activemodel/test/cases/validations/presence_validation_test.rb b/activemodel/test/cases/validations/presence_validation_test.rb index 510c13a7c3..fbb008f9ff 100644 --- a/activemodel/test/cases/validations/presence_validation_test.rb +++ b/activemodel/test/cases/validations/presence_validation_test.rb @@ -70,4 +70,38 @@ class PresenceValidationTest < ActiveModel::TestCase p[:karma] = "Cold" assert p.valid? end + + def test_validates_presence_of_with_allow_nil_option + Topic.validates_presence_of(:title, :allow_nil => true) + + t = Topic.new(:title => "something") + assert t.valid? + + t.title = "" + assert t.invalid? + assert_equal ["can't be blank"], t.errors[:title] + + t.title = " " + assert t.invalid? + assert_equal ["can't be blank"], t.errors[:title] + + t.title = nil + assert t.valid? + end + + def test_validates_presence_of_with_allow_blank_option + Topic.validates_presence_of(:title, :allow_blank => true) + + t = Topic.new(:title => "something") + assert t.valid? + + t.title = "" + assert t.valid? + + t.title = " " + assert t.valid? + + t.title = nil + assert t.valid? + end end |