我很难理解我们如何编写以下内容:
validates :email, presence: true
我认为这是类方法,因为以下代码在Rails中完美执行。
class User < ActiveRecord::Base
self.validates :email, presence: true
end
但是当我去Rails&#39;源代码,我发现validates
是一个实例方法,而不是类方法,在类定义中编写self.validates
给我的印象是它是类方法。
这是在Rails中定义的方式:
def validates(*attributes)
defaults = attributes.extract_options!.dup
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?
defaults[:attributes] = attributes
validations.each do |key, options|
next unless options
key = "#{key.to_s.camelize}Validator"
begin
validator = key.include?('::') ? key.constantize : const_get(key)
rescue NameError
raise ArgumentError, "Unknown validator: '#{key}'"
end
validates_with(validator, defaults.merge(_parse_validates_options(options)))
end
end
究竟是什么?
答案 0 :(得分:5)
正如Sergio在评论中指出的那样,因为Ruby中的每个类都是一个对象(类Class
的实例),validates
是Class
实例的方法。
您的User
课程继承了ActiveRecord::Base
的一堆内容。在这些继承的东西中有Validations模块。
<强>旁注:强> 通过coolest video观看关于 Ruby对象模型的Dave Thomas - 事情将变得更加清晰!