【问题标题】:What's the difference between "validate" and "validates"?“验证”和“验证”有什么区别?
【发布时间】:2013-08-11 01:03:08
【问题描述】:

我使用以下方法向对象添加了验证:

validate :field, presence: true

我发现他们没有给出错误信息。我将它们更改为validates 并收到错误消息。 This ticket 是相关的。

我尝试使用validates 添加自定义验证并收到错误:

You need to supply at least one validation

我将其更改为validate,一切都按预期进行。

我的理解是将validates 用于常规验证,将validate 用于自定义验证。那正确吗?还有其他我应该知道的吗?有没有办法让第一个问题大声失败,而不仅仅是验证所有内容?

【问题讨论】:

  • 可能一种是自定义验证语法validate,另一种是通用验证validates语法
  • @Viren - 我只是想知道我是否错过了其他任何事情。我无法找到对两者的明确解释,我希望 SO 可以提供。我同意,这是迄今为止我发现的唯一区别。
  • 我回答它时要记住灯塔的问题:)

标签: ruby-on-rails validation


【解决方案1】:

validates 此方法是所有默认验证器和任何以“Validator”结尾的自定义验证器类的快捷方式。请注意,Rails 默认验证器可以在特定类中被覆盖,方法是在它们的位置创建自定义验证器类,例如 PresenceValidator。

validates :title, :body, :presence => true

validate,向类添加验证方法或块。当覆盖 validate 实例方法变得过于笨拙并且您正在寻找更具描述性的验证声明时,这很有用。

validate :must_be_friends

  def must_be_friends
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end

【讨论】:

【解决方案2】:

我相信:validate 声明用于自定义 验证,而:validates 用于通用 验证,如字段上的presence, uniqueness etc

validate 方法查找具有参数名称的方法,即 如果你这样做 validate :field 它会寻找

def field 

end

在您的object 上。由于 Rails 为每个数据库 field 定义了一个 attr_accessorvalidate :field 将调用 field 的读取器方法。

如果验证函数返回true或者有error对象,即object.errors不为空,则认为该对象为valid?

因此ligthouse 问题中的原因,他们抱怨validate silently bypasses 验证:)

希望这有意义

【讨论】:

  • 啊,谢谢你的解释!我没有这样想,但它完全有道理。它还解释了为什么你不能让:validate“大声”失败,因为这是一个完全合理的(甚至可能会说“有效”......)调用。我没想到会这样。
  • 这非常重要。 严重 意想不到的结果只是一个字符而已。感谢您不仅发布“陷阱”,还发布其背后的科学。干杯!
  • Rails API 在这方面令人困惑 - 验证方法的静默失败是有问题的,特别是如果它们没有被测试捕获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 2011-04-13
  • 2020-09-04
  • 2020-07-16
  • 2015-12-11
  • 2015-07-23
相关资源
最近更新 更多