我刚刚开始讨好Ruby。我的背景是.NET和PHP。在Rails中,我也确信在其他框架中,我在类上看到类似的东西:
class Person < ActiveRecord::Base
validates :terms_of_service, :acceptance => true
end
究竟是什么“验证”?这是一个功能吗?如果它是一个函数,验证如何实际工作,因为你没有告诉验证函数你正在验证哪个模型?
我在哪里可以阅读更多关于这在幕后如何实际运作的内容?
答案 0 :(得分:9)
这有点复杂 - 但简短的回答是validates
是Person
的类方法,继承自ActiveRecord::Base
。该行同样可以写成validates(:terms_of_service, :acceptance => true)
。
validates
行时,它将其视为一个方法调用,其中当前self
对象是实例表示类Class
的{{1}}类,继承自Person
。它调用该方法,该方法将验证器挂钩到ActiveRecord::Base
类。
您可以阅读方法here - 但请注意,这会增加更多混淆,因为它将方法列为{{>> 实例方法{{ 1}}。咦?好吧,Ruby有两种方法从另一个Person
获取功能并将它放入你的类 - 你可以ActiveModel::Validations::ClassMethods
模块(在这种情况下它的实例方法成为你的类的实例方法),或者{ {1}}模块(在这种情况下,它的实例方法成为类的 class 方法)。
因此,总结一下:Module
被声明为include
的实例方法,extend
编入validates
。因此,ActiveModel::Validations::ClassMethods
是extend
的类方法,并且通过继承ActiveRecord::Base
。代码段中的行只是一个方法调用。
然而,尽管如此,大多数Rubyist和Railsists将在很大程度上忽略这些事实; validates
就是所谓的“装饰者”,大多数人只会将其作为关于 ActiveRecord::Base
的声明来阅读。
答案 1 :(得分:2)
这是一种特殊的回调方法,在将数据保存到数据库之前调用它来验证数据。
回调,更一般地说,是一种“挂钩”对象或代码模块/库的方法,以便在发生某些事件时自动调用该方法。在这种情况下,调用验证方法集的事件是尝试将某些内容保存到数据库的行为。这很有用,因为在将新的或更新的信息写入数据库之前,您需要确保它是有效的,以防止错误的数据泄漏到您的应用程序中。
以下方法触发验证,并且仅当所有验证都通过时才将对象保存到数据库(从字面意义上讲,这意味着所有验证方法必须返回不是false
的值,或{{ 1}}等,否则认为验证失败了):
有关验证的更多详细信息:http://guides.rubyonrails.org/active_record_validations_callbacks.html
Ruby(和Rails)在许多不同情况下使用“回调” - 几乎任何时候你都希望某些方法因某些事件而被调用。