【发布时间】:2016-01-28 09:07:59
【问题描述】:
我很难理解我们是如何编写以下行的:
validates :email, presence: true
我认为这是类方法,因为以下代码在 Rails 中完美执行。
class User < ActiveRecord::Base
self.validates :email, presence: true
end
但是翻到Rails的源码才知道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
究竟是什么?
【问题讨论】:
-
当然是实例方法。问题是,在哪个对象上? :)
-
如果你不知道,类是 ruby 中的对象,它们也有实例方法(你可能认为是“类方法”,但 ruby 中没有这样的东西)跨度>
-
@SergioTulentsev 我会说我以前不太困惑。 :) 你想向我推荐任何文章或资源以进一步了解这件事吗?
标签: ruby-on-rails ruby oop ruby-on-rails-4 activerecord