这......有点复杂 - 但简短的回答是,validates
是Person
一个类的方法,从ActiveRecord::Base
继承。该行可能已被写入validates(:terms_of_service, :acceptance => true)
。
红宝石,想了很多解释的语言,有效地“执行”类的定义,所以当它遇到validates
线,它认为这是一个方法调用在当前self
对象是Class
类代表类实例Person
,继承自ActiveRecord::Base
。它调用该方法,该方法将验证程序挂接到Person
类中。
你可以阅读有关该方法的here - 但是,请注意,增加了更多的混乱,因为它列出了方法的ActiveModel::Validations::ClassMethods
的实例方法。咦?那么,Ruby有两种方法可以从另一个Module
获取功能并将其放入您的类中 - 您可以使用include
模块(在这种情况下,它的实例方法成为您类的实例方法),或者模块(在这种情况下,它的实例方法成为类您的类的方法)。
因此,要总结:validates
被声明为的ActiveModel::Validations::ClassMethods
实例方法,这是extend
编入ActiveRecord::Base
。因此,validates
是ActiveRecord::Base
的一类方法,并且通过继承,Person
。代码片段中的行只是一个方法调用。然而,尽管如此,大多数Rubyists和Railsists将会在很大程度上忽略这些事实; validates
就是所谓的“装饰者”,大多数人只会简单地将其读作约Person
。
谢谢,这非常有帮助! – TaylorOtwell