aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
diff options
context:
space:
mode:
authorFrederick Cheung <frederick.cheung@gmail.com>2011-02-18 17:55:29 +0000
committerXavier Noria <fxn@hashref.com>2011-02-18 21:32:28 +0100
commitfbfa30a1eeaaab22ac8f43a4137ec8282920fe15 (patch)
tree5c62421750867a456c0af4e0f4402b0c5568ade1 /activemodel
parent00418ac96bf5a25d3a7cf760499ec19ad3700007 (diff)
downloadrails-fbfa30a1eeaaab22ac8f43a4137ec8282920fe15.tar.gz
rails-fbfa30a1eeaaab22ac8f43a4137ec8282920fe15.tar.bz2
rails-fbfa30a1eeaaab22ac8f43a4137ec8282920fe15.zip
Change validates inclusion to use cover? for Ranges in ruby 1.9 [#6453 state:committed]
Signed-off-by: Xavier Noria <fxn@hashref.com>
Diffstat (limited to 'activemodel')
-rw-r--r--activemodel/lib/active_model/validations/inclusion.rb23
-rw-r--r--activemodel/test/cases/validations/inclusion_validation_test.rb9
2 files changed, 29 insertions, 3 deletions
diff --git a/activemodel/lib/active_model/validations/inclusion.rb b/activemodel/lib/active_model/validations/inclusion.rb
index 049b093618..108586b8df 100644
--- a/activemodel/lib/active_model/validations/inclusion.rb
+++ b/activemodel/lib/active_model/validations/inclusion.rb
@@ -8,9 +8,26 @@ module ActiveModel
":in option of the configuration hash" unless options[:in].respond_to?(:include?)
end
- def validate_each(record, attribute, value)
- unless options[:in].include?(value)
- record.errors.add(attribute, :inclusion, options.except(:in).merge!(:value => value))
+ # On Ruby 1.9 Range#include? checks all possible values in the range for equality,
+ # so it may be slow for large ranges. The new Range#cover? uses the previous logic
+ # of comparing a value with the range endpoints.
+ if (1..2).respond_to?(:cover?)
+ def validate_each(record, attribute, value)
+ included = if options[:in].is_a?(Range)
+ options[:in].cover?(value)
+ else
+ options[:in].include?(value)
+ end
+
+ unless included
+ record.errors.add(attribute, :inclusion, options.except(:in).merge!(:value => value))
+ end
+ end
+ else
+ def validate_each(record, attribute, value)
+ unless options[:in].include?(value)
+ record.errors.add(attribute, :inclusion, options.except(:in).merge!(:value => value))
+ end
end
end
end
diff --git a/activemodel/test/cases/validations/inclusion_validation_test.rb b/activemodel/test/cases/validations/inclusion_validation_test.rb
index 0716b4f087..62f2ec785d 100644
--- a/activemodel/test/cases/validations/inclusion_validation_test.rb
+++ b/activemodel/test/cases/validations/inclusion_validation_test.rb
@@ -10,6 +10,15 @@ class InclusionValidationTest < ActiveModel::TestCase
Topic.reset_callbacks(:validate)
end
+ def test_validates_inclusion_of_range
+ Topic.validates_inclusion_of( :title, :in => 'aaa'..'bbb' )
+ assert Topic.new("title" => "bbc", "content" => "abc").invalid?
+ assert Topic.new("title" => "aa", "content" => "abc").invalid?
+ assert Topic.new("title" => "aaa", "content" => "abc").valid?
+ assert Topic.new("title" => "abc", "content" => "abc").valid?
+ assert Topic.new("title" => "bbb", "content" => "abc").valid?
+ end
+
def test_validates_inclusion_of
Topic.validates_inclusion_of( :title, :in => %w( a b c d e f g ) )