Add support for namespaced validators

Includes test and documentation for new feature

Signed-off-by: Santiago Pastorino <santiago@wyeworks.com>
This commit is contained in:
Samuel Kadolph 2010-12-09 13:30:02 -05:00 committed by Vijay Dev
parent 0dc39cd8ee
commit 972011a2e5
3 changed files with 21 additions and 1 deletions

@ -55,6 +55,10 @@ module ClassMethods
# validates :name, :title => true
# end
#
# Additionally validator classes may be in another namespace and still used within any class.
#
# validates :name, :'file/title' => true
#
# The validators hash can also handle regular expressions, ranges,
# arrays and strings in shortcut form, e.g.
#
@ -86,8 +90,10 @@ def validates(*attributes)
defaults.merge!(:attributes => attributes)
validations.each do |key, options|
key = "#{key.to_s.camelize}Validator"
begin
validator = const_get("#{key.to_s.camelize}Validator")
validator = key.include?('::') ? key.constantize : const_get(key)
rescue NameError
raise ArgumentError, "Unknown validator: '#{key}'"
end

@ -3,6 +3,7 @@
require 'models/person'
require 'models/person_with_validator'
require 'validators/email_validator'
require 'validators/namespace/email_validator'
class ValidatesTest < ActiveModel::TestCase
setup :reset_callbacks
@ -34,6 +35,13 @@ def test_validates_with_validator_class
assert_equal ['is not an email'], person.errors[:karma]
end
def test_validates_with_namespaced_validator_class
Person.validates :karma, :'namespace/email' => true
person = Person.new
person.valid?
assert_equal ['is not an email'], person.errors[:karma]
end
def test_validates_with_if_as_local_conditions
Person.validates :karma, :presence => true, :email => { :unless => :condition_is_true }
person = Person.new

@ -0,0 +1,6 @@
require 'validators/email_validator'
module Namespace
class EmailValidator < ::EmailValidator
end
end