Merge pull request #7282 from xHire/validates_length_of_fix

Length validation handles correctly nil. Fix #7180

Conflicts:
	activemodel/CHANGELOG.md
This commit is contained in:
Rafael Mendonça França 2012-11-26 18:44:07 -02:00
commit 5658923daa
3 changed files with 57 additions and 2 deletions

View File

@ -1,5 +1,9 @@
## Rails 4.0.0 (unreleased) ##
* Fixed length validator to correctly handle nil values. Fixes #7180.
*Michal Zima*
* Removed dispensable `require` statements. Make sure to require `active_model` before requiring
individual parts of the framework.

View File

@ -14,6 +14,10 @@ module ActiveModel
options[:minimum], options[:maximum] = range.min, range.max
end
if options[:allow_blank] == false && options[:minimum].nil? && options[:is].nil?
options[:minimum] = 1
end
super
end
@ -40,7 +44,10 @@ module ActiveModel
CHECKS.each do |key, validity_check|
next unless check_value = options[key]
next if value_length.send(validity_check, check_value)
if !value.nil? || skip_nil_check?(key)
next if value_length.send(validity_check, check_value)
end
errors_options[:count] = check_value
@ -58,6 +65,10 @@ module ActiveModel
options[:tokenizer].call(value)
end || value
end
def skip_nil_check?(key)
key == :maximum && options[:allow_nil].nil? && options[:allow_blank].nil?
end
end
module HelperMethods
@ -79,7 +90,8 @@ module ActiveModel
#
# Configuration options:
# * <tt>:minimum</tt> - The minimum size of the attribute.
# * <tt>:maximum</tt> - The maximum size of the attribute.
# * <tt>:maximum</tt> - The maximum size of the attribute. Allows +nil+ by
# default if not used with :minimum.
# * <tt>:is</tt> - The exact size of the attribute.
# * <tt>:within</tt> - A range specifying the minimum and maximum size of
# the attribute.

View File

@ -375,4 +375,43 @@ class LengthValidationTest < ActiveModel::TestCase
t.author_name = "A very long author name that should still be valid." * 100
assert t.valid?
end
def test_validates_length_of_using_maximum_should_not_allow_nil_when_nil_not_allowed
Topic.validates_length_of :title, :maximum => 10, :allow_nil => false
t = Topic.new
assert t.invalid?
end
def test_validates_length_of_using_maximum_should_not_allow_nil_and_empty_string_when_blank_not_allowed
Topic.validates_length_of :title, :maximum => 10, :allow_blank => false
t = Topic.new
assert t.invalid?
t.title = ""
assert t.invalid?
end
def test_validates_length_of_using_both_minimum_and_maximum_should_not_allow_nil
Topic.validates_length_of :title, :minimum => 5, :maximum => 10
t = Topic.new
assert t.invalid?
end
def test_validates_length_of_using_minimum_0_should_not_allow_nil
Topic.validates_length_of :title, :minimum => 0
t = Topic.new
assert t.invalid?
t.title = ""
assert t.valid?
end
def test_validates_length_of_using_is_0_should_not_allow_nil
Topic.validates_length_of :title, :is => 0
t = Topic.new
assert t.invalid?
t.title = ""
assert t.valid?
end
end