Rails的“验证”是什么类型的语言结构?

时间:2011-12-02 15:53:40

标签: ruby-on-rails ruby

我刚刚开始讨好Ruby。我的背景是.NET和PHP。在Rails中,我也确信在其他框架中,我在类上看到类似的东西:

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

究竟是什么“验证”?这是一个功能吗?如果它是一个函数,验证如何实际工作,因为你没有告诉验证函数你正在验证哪个模型?

我在哪里可以阅读更多关于这在幕后如何实际运作的内容?

2 个答案:

答案 0 :(得分:9)

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

像许多解释语言一样,Ruby有效地“执行”类定义,因此当遇到validates行时,它将其视为一个方法调用,其中当前self对象是实例表示类Class的{​​{1}}类,继承自Person。它调用该方法,该方法将验证器挂钩到ActiveRecord::Base类。

您可以阅读方法here - 但请注意,这会增加更多混淆,因为它将方法列为{{>> 实例方法{{ 1}}。咦?好吧,Ruby有两种方法从另一个Person获取功能并将它放入你的类 - 你可以ActiveModel::Validations::ClassMethods模块(在这种情况下它的实例方法成为你的类的实例方法),或者{ {1}}模块(在这种情况下,它的实例方法成为类的 class 方法)。

因此,总结一下:Module被声明为include的实例方法,extend编入validates。因此,ActiveModel::Validations::ClassMethodsextend的类方法,并且通过继承ActiveRecord::Base。代码段中的行只是一个方法调用。

然而,尽管如此,大多数Rubyist和Railsists将在很大程度上忽略这些事实; validates就是所谓的“装饰者”,大多数人只会将其作为关于 ActiveRecord::Base的声明来阅读。

答案 1 :(得分:2)

这是一种特殊的回调方法,在将数据保存到数据库之前调用它来验证数据。

回调,更一般地说,是一种“挂钩”对象或代码模块/库的方法,以便在发生某些事件时自动调用该方法。在这种情况下,调用验证方法集的事件是尝试将某些内容保存到数据库的行为。这很有用,因为在将新的或更新的信息写入数据库之前,您需要确保它是有效的,以防止错误的数据泄漏到您的应用程序中。

以下方法触发验证,并且仅当所有验证都通过时才将对象保存到数据库(从字面意义上讲,这意味着所有验证方法必须返回不是false的值,或{{ 1}}等,否则认为验证失败了):

  • 创建
  • 创建!
  • 保存
  • 保存!
  • 更新
  • update_attributes方法
  • update_attributes方法!
Ruby中的“方法”与其他语言中的函数概念非常相似。在许多情况下,您可以互换地思考它们 - 它们声明了一些功能,它们将参数作为输入,并将结果作为输出返回。

有关验证的更多详细信息:http://guides.rubyonrails.org/active_record_validations_callbacks.html

Ruby(和Rails)在许多不同情况下使用“回调” - 几乎任何时候你都希望某些方法因某些事件而被调用。

更多关于回调的阅读:http://www.khelll.com/blog/ruby/ruby-callbacks/