提交 35cb7722 编写于 作者: R Rafael Mendonça França

Merge pull request #7342 from sobrinho/master

Accept a symbol for `:in` option on inclusion and exclusion validators
## Rails 4.0.0 (unreleased) ##
* Changed inclusion and exclusion validators to accept a symbol for `:in` option.
This allows to use dynamic inclusion/exclusion values using methods, besides the current lambda/proc support.
*Gabriel Sobrinho*
* `AM::Validation#validates` ability to pass custom exception to `:strict` option.
*Bogdan Gusiev*
......
......@@ -3,11 +3,11 @@
module ActiveModel
module Validations
module Clusivity #:nodoc:
ERROR_MESSAGE = "An object with the method #include? or a proc or lambda is required, " <<
ERROR_MESSAGE = "An object with the method #include? or a proc, lambda or symbol is required, " <<
"and must be supplied as the :in (or :within) option of the configuration hash"
def check_validity!
unless [:include?, :call].any?{ |method| delimiter.respond_to?(method) }
unless delimiter.respond_to?(:include?) || delimiter.respond_to?(:call) || delimiter.respond_to?(:to_sym)
raise ArgumentError, ERROR_MESSAGE
end
end
......@@ -15,7 +15,14 @@ def check_validity!
private
def include?(record, value)
exclusions = delimiter.respond_to?(:call) ? delimiter.call(record) : delimiter
exclusions = if delimiter.respond_to?(:call)
delimiter.call(record)
elsif delimiter.respond_to?(:to_sym)
record.send(delimiter)
else
delimiter
end
exclusions.send(inclusion_method(exclusions), value)
end
......
......@@ -24,11 +24,12 @@ module HelperMethods
# validates_exclusion_of :format, in: %w( mov avi ), message: "extension %{value} is not allowed"
# validates_exclusion_of :password, in: ->(person) { [person.username, person.first_name] },
# message: 'should not be the same as your username or first name'
# validates_exclusion_of :karma, in: :reserved_karmas
# end
#
# Configuration options:
# * <tt>:in</tt> - An enumerable object of items that the value shouldn't
# be part of. This can be supplied as a proc or lambda which returns an
# be part of. This can be supplied as a proc, lambda or symbol which returns an
# enumerable. If the enumerable is a range the test is performed with
# * <tt>:within</tt> - A synonym(or alias) for <tt>:in</tt>
# <tt>Range#cover?</tt>, otherwise with <tt>include?</tt>.
......
......@@ -23,11 +23,12 @@ module HelperMethods
# validates_inclusion_of :age, in: 0..99
# validates_inclusion_of :format, in: %w( jpg gif png ), message: "extension %{value} is not included in the list"
# validates_inclusion_of :states, in: ->(person) { STATES[person.country] }
# validates_inclusion_of :karma, in: :available_karmas
# end
#
# Configuration options:
# * <tt>:in</tt> - An enumerable object of available items. This can be
# supplied as a proc or lambda which returns an enumerable. If the
# supplied as a proc, lambda or symbol which returns an enumerable. If the
# enumerable is a range the test is performed with <tt>Range#cover?</tt>,
# otherwise with <tt>include?</tt>.
# * <tt>:within</tt> - A synonym(or alias) for <tt>:in</tt>
......
......@@ -64,4 +64,26 @@ def test_validates_exclusion_of_with_lambda
t.title = "wasabi"
assert t.valid?
end
def test_validates_inclusion_of_with_symbol
Person.validates_exclusion_of :karma, :in => :reserved_karmas
p = Person.new
p.karma = "abe"
def p.reserved_karmas
%w(abe)
end
assert p.invalid?
assert_equal ["is reserved"], p.errors[:karma]
def p.reserved_karmas
%w()
end
assert p.valid?
ensure
Person.reset_callbacks(:validate)
end
end
......@@ -96,4 +96,26 @@ def test_validates_inclusion_of_with_lambda
t.title = "elephant"
assert t.valid?
end
def test_validates_inclusion_of_with_symbol
Person.validates_inclusion_of :karma, :in => :available_karmas
p = Person.new
p.karma = "Lifo"
def p.available_karmas
%w()
end
assert p.invalid?
assert_equal ["is not included in the list"], p.errors[:karma]
def p.available_karmas
%w(Lifo)
end
assert p.valid?
ensure
Person.reset_callbacks(:validate)
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册