1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Change validates inclusion to use cover? for Ranges in ruby 1.9 [#6453 state:committed]

Signed-off-by: Xavier Noria <fxn@hashref.com>
This commit is contained in:
Frederick Cheung 2011-02-18 17:55:29 +00:00 committed by Xavier Noria
parent 00418ac96b
commit fbfa30a1ee
2 changed files with 29 additions and 3 deletions

View file

@ -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

View file

@ -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 ) )