首页 > 解决方案 > Rails 中的验证在内部使用元编程?它实际上是如何工作的?

问题描述

我们已经在 rails 中看到我们对特定列执行类似这样的验证 -
validates :first_name, presence: true
这个语句实际上是做什么的?我认为它为我们的模型类创建了一个类方法,其方法名为“first_name”。一旦有人执行 object.first_name 并查找此参数的值,就会调用此方法,以防 value 为空引发错误,否则返回 true。
我不确定我是否在这里。如果有人可以解释整个周期,那就太好了。谢谢!

标签: ruby-on-railsrubyvalidationmetaprogramming

解决方案


如果您的模型中有validates :attribute, presence: true一行,则它与存储在数据库中的属性相关,而不是自定义方法。

您的验证将在数据库中的模型表中搜索记录,并确保 first_name 属性不为零。

编辑:正如 mrzasa 在下面指出的那样,它实际上并没有在验证时检索您的记录的新实例,而是使用当前内存中的属性

如果是,它将在您的记录中添加一个验证错误,您将无法保存它。

如果您想了解验证的工作原理,我强烈建议您阅读https://guides.rubyonrails.org/active_record_validations.html#validations-overview 。


推荐阅读