【问题标题】:Validations in rails uses meta programming internally? How it actually works?Rails 中的验证在内部使用元编程?它实际上是如何工作的?
【发布时间】:2020-01-21 06:00:36
【问题描述】:

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

【问题讨论】:

  • 在将对象保存到数据库之前检查是否存在 first_name 属性。它在写入之前完成一次,并且在检索对象时不再使用。
  • validates 是一种 ruby​​ 方法,可确保仅将有效数据保存到数据库中。您也可以创建自己的自定义验证。

标签: ruby-on-rails ruby validation metaprogramming


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 一个澄清 - 验证没有到达数据库,它验证内存中模型对象的属性。
猜你喜欢
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2013-09-27
  • 2014-10-06
  • 2014-09-24
  • 1970-01-01
  • 2016-10-05
相关资源
最近更新 更多