2011-12-02 68 views
4

我刚刚开始讨论Ruby。我的背景是.NET和PHP。在Rails中,我敢肯定,在其他框架,以及,我看到这样的东西的类:Rails的“验证”是什么类型的语言结构?

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

究竟什么是“只会验证”?它是一个函数吗?如果它是一个函数,验证实际上是如何工作的,因为你不告诉validates函数你正在验证哪个模型?

我在哪里可以阅读更多关于这个幕后实际情况的信息?

回答

9

这......有点复杂 - 但简短的回答是,validatesPerson一个类的方法,从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。因此,validatesActiveRecord::Base的一类方法,并且通过继承,Person。代码片段中的行只是一个方法调用。然而,尽管如此,大多数Rubyists和Railsists将会在很大程度上忽略这些事实; validates就是所谓的“装饰者”,大多数人只会简单地将其读作Person

+0

谢谢,这非常有帮助! – TaylorOtwell

2

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

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

以下方法触发验证,并将保存对象,以仅当所有的验证通过数据库(在字面意义上,这意味着所有的验证方法必须返回一个值,该值是不false,或nil等,否则验证被认为是失败):

  • 创建
  • 创造!
  • 节省
  • 节省!
  • 更新
  • update_attributes
  • update_attributes!

Ruby中的“Methods”非常类似于其他语言中的函数的概念。在许多情况下,你可以互换地考虑它们 - 它们声明了一些功能,它们将参数作为输入,并将结果作为输出返回。

上验证的更多细节:http://guides.rubyonrails.org/active_record_validations_callbacks.html

红宝石(和Rails)在许多不同的情况下使用“回调” - 你想几乎随时随地一些方法被调用一些事件发生的历史的结果。

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

+0

感谢您的回复。那么这个方法实际上属于这个类吗?如果是这样,我认为它可以使用晚期静态绑定来知道它正在验证哪个模型?我只是不习惯看到坐在这样的班级中的方法调用。通常他们在其他方法或其他方面。 – TaylorOtwell

+0

这是一种类方法。当没有一个方法被调用时,Ruby有一个隐式的自我接收器,在这种情况下,它将成为你的ActiveRecord子类。 Rails在幕后维护一个验证列表,当validate方法在类加载时执行时,它会向链中添加一个回调。回调将在@ normalocity的答案中列出的方法之后进行检查。 – Kyle

+0

验证方法集合来自ActiveRecord :: Validations(http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html) - 该链接提供了几个“show source”链接,它们将显示实际的源代码验证方法如何声明的代码,并且可能会为您提供更多的信息。 – jefflunt

相关问题