這......有點複雜 - 但簡短的回答是,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