mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
d6cbb27e7b
Having a huge array to whitelist options is not the proper way to handle this case. This means that the ActiveModel::Errors object should know about the options given in *all* validators and break the extensibility added by the validators itself. If the intent is to whitelist options before sending them to I18n, each validator should clean its respective options instead of throwing the responsibility to the Errors object.
This reverts commit bc1c8d58ec
.
40 lines
2.3 KiB
Ruby
40 lines
2.3 KiB
Ruby
module ActiveModel
|
|
module Validations
|
|
class ExclusionValidator < EachValidator
|
|
def check_validity!
|
|
raise ArgumentError, "An object with the method include? is required must be supplied as the " <<
|
|
":in option of the configuration hash" unless options[:in].respond_to?(:include?)
|
|
end
|
|
|
|
def validate_each(record, attribute, value)
|
|
return unless options[:in].include?(value)
|
|
record.errors.add(attribute, :exclusion, :default => options[:message], :value => value)
|
|
end
|
|
end
|
|
|
|
module HelperMethods
|
|
# Validates that the value of the specified attribute is not in a particular enumerable object.
|
|
#
|
|
# class Person < ActiveRecord::Base
|
|
# validates_exclusion_of :username, :in => %w( admin superuser ), :message => "You don't belong here"
|
|
# validates_exclusion_of :age, :in => 30..60, :message => "This site is only for under 30 and over 60"
|
|
# validates_exclusion_of :format, :in => %w( mov avi ), :message => "extension %{value} is not allowed"
|
|
# end
|
|
#
|
|
# Configuration options:
|
|
# * <tt>:in</tt> - An enumerable object of items that the value shouldn't be part of.
|
|
# * <tt>:message</tt> - Specifies a custom error message (default is: "is reserved").
|
|
# * <tt>:allow_nil</tt> - If set to true, skips this validation if the attribute is +nil+ (default is +false+).
|
|
# * <tt>:allow_blank</tt> - If set to true, skips this validation if the attribute is blank (default is +false+).
|
|
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
|
|
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
|
# method, proc or string should return or evaluate to a true or false value.
|
|
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
|
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
|
# method, proc or string should return or evaluate to a true or false value.
|
|
def validates_exclusion_of(*attr_names)
|
|
validates_with ExclusionValidator, _merge_attributes(attr_names)
|
|
end
|
|
end
|
|
end
|
|
end
|