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"
|
"and must be supplied as the :in option of the configuration hash"
|
||||||
|
|
||||||
def check_validity!
|
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
|
raise ArgumentError, ERROR_MESSAGE
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -15,11 +15,14 @@ module ActiveModel
|
||||||
private
|
private
|
||||||
|
|
||||||
def include?(record, value)
|
def include?(record, value)
|
||||||
delimiter = options[:in]
|
exclusions = range.respond_to?(:call) ? range.call(record) : range
|
||||||
exclusions = delimiter.respond_to?(:call) ? delimiter.call(record) : delimiter
|
|
||||||
exclusions.send(inclusion_method(exclusions), value)
|
exclusions.send(inclusion_method(exclusions), value)
|
||||||
end
|
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
|
# 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>
|
# 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.
|
# 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]
|
assert_equal ["option monkey is restricted"], t.errors[:title]
|
||||||
end
|
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
|
def test_validates_exclusion_of_for_ruby_class
|
||||||
Person.validates_exclusion_of :karma, :in => %w( abe monkey )
|
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]
|
assert_equal ["option uhoh is not in the list"], t.errors[:title]
|
||||||
end
|
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
|
def test_validates_inclusion_of_for_ruby_class
|
||||||
Person.validates_inclusion_of :karma, :in => %w( abe monkey )
|
Person.validates_inclusion_of :karma, :in => %w( abe monkey )
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue