Provide a way to specify alternate option keys for validates

This commit is contained in:
Carl Lerche 2011-02-05 16:00:57 -08:00
parent 7176ade35b
commit ed7614aa7d
3 changed files with 22 additions and 1 deletions

View File

@ -81,7 +81,7 @@ module ActiveModel
#
def validates(*attributes)
defaults = attributes.extract_options!
validations = defaults.slice!(:if, :unless, :on, :allow_blank, :allow_nil)
validations = defaults.slice!(*_validates_default_keys)
raise ArgumentError, "You need to supply at least one attribute" if attributes.empty?
raise ArgumentError, "You need to supply at least one validation" if validations.empty?
@ -103,6 +103,12 @@ module ActiveModel
protected
# When creating custom validators, it might be useful to be able to specify
# additional default keys. This can be done by overwriting this method.
def _validates_default_keys
[ :if, :unless, :on, :allow_blank, :allow_nil ]
end
def _parse_validates_options(options) #:nodoc:
case options
when TrueClass

View File

@ -1,6 +1,7 @@
# encoding: utf-8
require 'cases/helper'
require 'models/person'
require 'models/topic'
require 'models/person_with_validator'
require 'validators/email_validator'
require 'validators/namespace/email_validator'
@ -11,6 +12,7 @@ class ValidatesTest < ActiveModel::TestCase
def reset_callbacks
Person.reset_callbacks(:validate)
Topic.reset_callbacks(:validate)
PersonWithValidator.reset_callbacks(:validate)
end
@ -139,4 +141,13 @@ class ValidatesTest < ActiveModel::TestCase
person.valid?
assert_equal ['does not appear to be like Mr.'], person.errors[:title]
end
def test_defining_extra_default_keys_for_validates
Topic.validates :title, :confirmation => true, :message => 'Y U NO CONFIRM'
topic = Topic.new
topic.title = "What's happening"
topic.title_confirmation = "Not this"
assert !topic.valid?
assert_equal ['Y U NO CONFIRM'], topic.errors[:title]
end
end

View File

@ -2,6 +2,10 @@ class Topic
include ActiveModel::Validations
include ActiveModel::Validations::Callbacks
def self._validates_default_keys
super | [ :message ]
end
attr_accessor :title, :author_name, :content, :approved
attr_accessor :after_validation_performed