mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
validates_inclusion_of
and validates_exclusion_of
now accept
`:within` option as alias of `:in` as documented. Fix #7118
This commit is contained in:
parent
f3e4d2097d
commit
53edd32684
3 changed files with 26 additions and 3 deletions
|
@ -7,7 +7,7 @@ module ActiveModel
|
|||
"and must be supplied as the :in option of the configuration hash"
|
||||
|
||||
def check_validity!
|
||||
unless [:include?, :call].any?{ |method| options[:in].respond_to?(method) }
|
||||
unless [:include?, :call].any?{ |method| range.respond_to?(method) }
|
||||
raise ArgumentError, ERROR_MESSAGE
|
||||
end
|
||||
end
|
||||
|
@ -15,11 +15,14 @@ module ActiveModel
|
|||
private
|
||||
|
||||
def include?(record, value)
|
||||
delimiter = options[:in]
|
||||
exclusions = delimiter.respond_to?(:call) ? delimiter.call(record) : delimiter
|
||||
exclusions = range.respond_to?(:call) ? range.call(record) : range
|
||||
exclusions.send(inclusion_method(exclusions), value)
|
||||
end
|
||||
|
||||
def range
|
||||
@range ||= options[:in] || options[:within]
|
||||
end
|
||||
|
||||
# In Ruby 1.9 <tt>Range#include?</tt> on non-numeric ranges checks all possible values in the
|
||||
# range for equality, so it may be slow for large ranges. The new <tt>Range#cover?</tt>
|
||||
# uses the previous logic of comparing a value with the range endpoints.
|
||||
|
|
|
@ -28,6 +28,16 @@ class ExclusionValidationTest < ActiveModel::TestCase
|
|||
assert_equal ["option monkey is restricted"], t.errors[:title]
|
||||
end
|
||||
|
||||
def test_validates_exclusion_of_with_within_option
|
||||
Topic.validates_exclusion_of( :title, :within => %w( abe monkey ) )
|
||||
|
||||
assert Topic.new("title" => "something", "content" => "abc")
|
||||
|
||||
t = Topic.new("title" => "monkey")
|
||||
assert t.invalid?
|
||||
assert t.errors[:title].any?
|
||||
end
|
||||
|
||||
def test_validates_exclusion_of_for_ruby_class
|
||||
Person.validates_exclusion_of :karma, :in => %w( abe monkey )
|
||||
|
||||
|
|
|
@ -60,6 +60,16 @@ class InclusionValidationTest < ActiveModel::TestCase
|
|||
assert_equal ["option uhoh is not in the list"], t.errors[:title]
|
||||
end
|
||||
|
||||
def test_validates_inclusion_of_with_within_option
|
||||
Topic.validates_inclusion_of( :title, :within => %w( a b c d e f g ) )
|
||||
|
||||
assert Topic.new("title" => "a", "content" => "abc").valid?
|
||||
|
||||
t = Topic.new("title" => "uhoh", "content" => "abc")
|
||||
assert t.invalid?
|
||||
assert t.errors[:title].any?
|
||||
end
|
||||
|
||||
def test_validates_inclusion_of_for_ruby_class
|
||||
Person.validates_inclusion_of :karma, :in => %w( abe monkey )
|
||||
|
||||
|
|
Loading…
Reference in a new issue