From 275f922a23b780600a32f70de5b661371c8ffdf4 Mon Sep 17 00:00:00 2001 From: Obie Fernandez Date: Mon, 20 Sep 2010 21:35:41 -0400 Subject: Better shortcut options for custom validators [#5672 state:resolved] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: José Valim --- activemodel/lib/active_model/validations/validates.rb | 15 ++++++++++----- activemodel/test/cases/validations/validates_test.rb | 9 +++++++++ activemodel/test/models/person_with_validator.rb | 13 +++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/activemodel/lib/active_model/validations/validates.rb b/activemodel/lib/active_model/validations/validates.rb index f6349d57a5..77c5073c6e 100644 --- a/activemodel/lib/active_model/validations/validates.rb +++ b/activemodel/lib/active_model/validations/validates.rb @@ -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 diff --git a/activemodel/test/cases/validations/validates_test.rb b/activemodel/test/cases/validations/validates_test.rb index db023f6169..666c48c8a0 100644 --- a/activemodel/test/cases/validations/validates_test.rb +++ b/activemodel/test/cases/validations/validates_test.rb @@ -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 diff --git a/activemodel/test/models/person_with_validator.rb b/activemodel/test/models/person_with_validator.rb index f6f665ccee..505ed880c1 100644 --- a/activemodel/test/models/person_with_validator.rb +++ b/activemodel/test/models/person_with_validator.rb @@ -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 -- cgit v1.2.3