我刚刚开始理解 Ruby。我的背景是 .NET 和 PHP。在 Rails 中,而且我确信在其他框架中,我在类中看到类似这样的内容:
class Person < ActiveRecord::Base
validates :terms_of_service, :acceptance => true
end
“验证”到底是什么?它是一个函数吗?如果它是一个函数,那么验证实际上是如何工作的,因为您没有告诉验证函数您正在验证哪个模型?
我在哪里可以阅读更多有关幕后实际工作原理的信息?
最佳答案
这...有点复杂 - 但简短的回答是 validates
是 Person
的类方法, 继承自 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
.因此,validates
是 ActiveRecord::Base
的类方法并且,通过继承,Person
.您的代码片段中的行只是一个方法调用。
然而,说了这么多,大多数 Rubyist 和 Railsist 将在很大程度上忽略这些事实; validates
就是所谓的“装饰器”,大多数人会将其简单地理解为声明关于 Person
.
关于ruby-on-rails - Rails 的 "validates"是什么类型的语言结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8358947/