是`validates`是Rails中的类方法还是实例方法?

时间:2015-10-28 14:24:32

标签: ruby-on-rails ruby oop ruby-on-rails-4 activerecord

我很难理解我们如何编写以下内容:

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

究竟是什么?

1 个答案:

答案 0 :(得分:5)

这是class instance method:)

正如Sergio在评论中指出的那样,因为Ruby中的每个类都是一个对象(类Class的实例),validatesClass实例的方法。

您的User课程继承了ActiveRecord::Base的一堆内容。在这些继承的东西中有Validations模块。

<强>旁注: 通过coolest video观看关于 Ruby对象模型Dave Thomas - 事情将变得更加清晰!