mirror of
https://github.com/github/rails.git
synced 2026-01-10 07:07:54 -05:00
Better shortcut options for custom validators [#5672 state:resolved]
Signed-off-by: José Valim <jose.valim@gmail.com>
This commit is contained in:
committed by
José Valim
parent
097240f602
commit
275f922a23
@@ -55,14 +55,19 @@ module ActiveModel
|
||||
# validates :name, :title => true
|
||||
# end
|
||||
#
|
||||
# The validators hash can also handle regular expressions, ranges and arrays:
|
||||
# The validators hash can also handle regular expressions, ranges,
|
||||
# arrays and strings in shortcut form, e.g.
|
||||
#
|
||||
# validates :email, :format => /@/
|
||||
# validates :gender, :inclusion => %w(male female)
|
||||
# validates :password, :length => 6..20
|
||||
#
|
||||
# Finally, the options :if, :unless, :on, :allow_blank and :allow_nil can be given
|
||||
# to one specific validator:
|
||||
# When using shortcut form, ranges and arrays are passed to your
|
||||
# validator's initializer as +options[:in]+ while other types including
|
||||
# regular expressions and strings are passed as +options[:with]+
|
||||
#
|
||||
# Finally, the options +:if+, +:unless+, +:on+, +:allow_blank+ and +:allow_nil+ can be given
|
||||
# to one specific validator, as a hash:
|
||||
#
|
||||
# validates :password, :presence => { :if => :password_required? }, :confirmation => true
|
||||
#
|
||||
@@ -99,10 +104,10 @@ module ActiveModel
|
||||
{}
|
||||
when Hash
|
||||
options
|
||||
when Regexp
|
||||
{ :with => options }
|
||||
when Range, Array
|
||||
{ :in => options }
|
||||
else
|
||||
{ :with => options }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -111,4 +111,13 @@ class ValidatesTest < ActiveModel::TestCase
|
||||
person.valid?
|
||||
assert_equal ['Local validator please'], person.errors[:title]
|
||||
end
|
||||
|
||||
def test_validates_with_included_validator_and_wildcard_shortcut
|
||||
# Shortcut for PersonWithValidator.validates :title, :like => { :with => "Mr." }
|
||||
PersonWithValidator.validates :title, :like => "Mr."
|
||||
person = PersonWithValidator.new
|
||||
person.title = "Ms. Pacman"
|
||||
person.valid?
|
||||
assert_equal ['does not appear to be like Mr.'], person.errors[:title]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,5 +7,18 @@ class PersonWithValidator
|
||||
end
|
||||
end
|
||||
|
||||
class LikeValidator < ActiveModel::EachValidator
|
||||
def initialize(options)
|
||||
@with = options[:with]
|
||||
super
|
||||
end
|
||||
|
||||
def validate_each(record, attribute, value)
|
||||
unless value[@with]
|
||||
record.errors.add attribute, "does not appear to be like #{@with}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
attr_accessor :title, :karma
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user