ruby-on-rails - Rails 的 "validates"是什么类型的语言结构?

标签 ruby-on-rails ruby

我刚刚开始理解 Ruby。我的背景是 .NET 和 PHP。在 Rails 中,而且我确信在其他框架中,我在类中看到类似这样的内容:

class Person < ActiveRecord::Base
    validates :terms_of_service, :acceptance => true
end

“验证”到底是什么?它是一个函数吗?如果它是一个函数,那么验证实际上是如何工作的,因为您没有告诉验证函数您正在验证哪个模型?

我在哪里可以阅读更多有关幕后实际工作原理的信息?

最佳答案

这...有点复杂 - 但简短的回答是 validatesPerson 的类方法, 继承自 ActiveRecord::Base .该行同样可以写成 validates(:terms_of_service, :acceptance => true) .

Ruby 和许多解释型语言一样,有效地“执行”类定义,所以当它遇到 validates 时行,它将它视为一个方法调用,其中当前 self对象是 Class 的实例代表类(class)的类(class) Person , 继承自 ActiveRecord::Base .它调用该方法,该方法具有将验证器挂接到 Person 的效果。类。

您可以阅读有关该方法的信息 here - 但请注意,这增加了更多的混淆,因为它将方法列为 ActiveModel::Validations::ClassMethods实例方法。 .嗯?好吧,Ruby 有两种从另一个 Module 获取功能的方法并将其放入您的类(class) - 您可以 include模块(在这种情况下它的实例方法成为你的类的实例方法),或者 extend模块(在这种情况下,它的实例方法成为您的类的方法)。

所以,总结一下:validates被声明为 ActiveModel::Validations::ClassMethods 的实例方法,即 extend进入ActiveRecord::Base .因此,validatesActiveRecord::Base 的类方法并且,通过继承,Person .您的代码片段中的行只是一个方法调用。

然而,说了这么多,大多数 Rubyist 和 Railsist 将在很大程度上忽略这些事实; validates就是所谓的“装饰器”,大多数人会将其简单地理解为声明关于 Person .

关于ruby-on-rails - Rails 的 "validates"是什么类型的语言结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8358947/

相关文章:

ruby - 即使默认路由是用模块化风格实现的,Sinatra 也不知道这个小事

ruby-on-rails - Arel `between` 以其他列为范围

ruby-on-rails - 适用于 rspec 和 Rails 的 Shoulda 与 Remarkable

javascript - 如何在 View 文件夹中包含 js.erb 文件

ruby - 使用 Ruby Sinatra 创建单页代理

Ruby 循环顺序?

ruby - 什么时候会使用字符串的替换方法?

ruby-on-rails - ActionController::UrlGenerationError:没有自定义路由的路由匹配

ruby-on-rails - Ruby 创建递归目录树

ruby-on-rails - 升级到 rails 3.0.7 --> 3.1 时,form_tag 不工作