【问题标题】:Is `validates` a class method or an instance method in Rails?`validates` 是 Rails 中的类方法还是实例方法?
【发布时间】: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


【解决方案1】:

这是class instance method :)

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

你的User 类从ActiveRecord::Base 继承了一堆东西。在这些继承的东西中有Validations 模块。


旁注: 观看coolest videoDave Thomas 的关于 Ruby 对象模型的视频 - 事情会变得更加清晰!

【讨论】:

  • 我已经接受了你的回答,但我认为我真的需要深入了解 class-object-stuff 才能真正理解这一点事情。
  • @ArslanAli:读一本书叫“metaprogramming ruby​​”,应该会有帮助
  • @ArslanAli 看到编辑,是的!元编程 Ruby 也是了解您需要什么的好工具
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2011-05-19
  • 2012-07-24
  • 2018-07-26
  • 2015-11-25
  • 2013-04-22
相关资源
最近更新 更多