mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Use define_callbacks helper for ActiveRecord validations.
This commit is contained in:
parent
14a40804a2
commit
46ab7422d9
4 changed files with 25 additions and 57 deletions
|
@ -3,23 +3,7 @@ module ActiveModel
|
|||
def self.included(base) # :nodoc:
|
||||
base.extend(ClassMethods)
|
||||
base.send!(:include, ActiveSupport::Callbacks)
|
||||
|
||||
%w( validate validate_on_create validate_on_update ).each do |validation_method|
|
||||
base.class_eval <<-"end_eval"
|
||||
def self.#{validation_method}(*methods, &block)
|
||||
self.#{validation_method}_callback_chain | CallbackChain.build(:#{validation_method}, *methods, &block)
|
||||
end
|
||||
|
||||
def self.#{validation_method}_callback_chain
|
||||
if chain = read_inheritable_attribute(:#{validation_method})
|
||||
return chain
|
||||
else
|
||||
write_inheritable_attribute(:#{validation_method}, CallbackChain.new)
|
||||
return #{validation_method}_callback_chain
|
||||
end
|
||||
end
|
||||
end_eval
|
||||
end
|
||||
base.define_callbacks :validate, :validate_on_create, :validate_on_update
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
|
|
|
@ -281,23 +281,7 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
base.send :include, ActiveSupport::Callbacks
|
||||
|
||||
VALIDATIONS.each do |validation_method|
|
||||
base.class_eval <<-"end_eval"
|
||||
def self.#{validation_method}(*methods, &block)
|
||||
self.#{validation_method}_callback_chain | CallbackChain.build(:#{validation_method}, *methods, &block)
|
||||
end
|
||||
|
||||
def self.#{validation_method}_callback_chain
|
||||
if chain = read_inheritable_attribute(:#{validation_method})
|
||||
return chain
|
||||
else
|
||||
write_inheritable_attribute(:#{validation_method}, CallbackChain.new)
|
||||
return #{validation_method}_callback_chain
|
||||
end
|
||||
end
|
||||
end_eval
|
||||
end
|
||||
base.define_callbacks *VALIDATIONS
|
||||
end
|
||||
|
||||
# All of the following validations are defined in the class scope of the model that you're interested in validating.
|
||||
|
|
|
@ -58,9 +58,9 @@ class ValidationsTest < ActiveRecord::TestCase
|
|||
fixtures :topics, :developers, 'warehouse-things'
|
||||
|
||||
def setup
|
||||
Topic.write_inheritable_attribute(:validate, nil)
|
||||
Topic.write_inheritable_attribute(:validate_on_create, nil)
|
||||
Topic.write_inheritable_attribute(:validate_on_update, nil)
|
||||
Topic.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
|
||||
Topic.instance_variable_set("@validate_on_create_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
|
||||
Topic.instance_variable_set("@validate_on_update_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
|
||||
end
|
||||
|
||||
def test_single_field_validation
|
||||
|
@ -1351,9 +1351,9 @@ class ValidatesNumericalityTest < ActiveRecord::TestCase
|
|||
JUNK = ["not a number", "42 not a number", "0xdeadbeef", "00-1", "--3", "+-3", "+3-1", "-+019.0", "12.12.13.12", "123\nnot a number"]
|
||||
|
||||
def setup
|
||||
Topic.write_inheritable_attribute(:validate, nil)
|
||||
Topic.write_inheritable_attribute(:validate_on_create, nil)
|
||||
Topic.write_inheritable_attribute(:validate_on_update, nil)
|
||||
Topic.instance_variable_set("@validate_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
|
||||
Topic.instance_variable_set("@validate_on_create_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
|
||||
Topic.instance_variable_set("@validate_on_update_callbacks", ActiveSupport::Callbacks::CallbackChain.new)
|
||||
end
|
||||
|
||||
def test_default_validates_numericality_of
|
||||
|
|
|
@ -99,8 +99,8 @@ module ActiveSupport
|
|||
def |(chain)
|
||||
if chain.is_a?(CallbackChain)
|
||||
chain.each { |callback| self | callback }
|
||||
elsif chain.is_a?(Callback)
|
||||
if index = index(chain)
|
||||
else
|
||||
if (found_callback = find(chain)) && (index = index(chain))
|
||||
self[index] = chain
|
||||
else
|
||||
self << chain
|
||||
|
|
Loading…
Reference in a new issue