59

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

validate :field, presence: true

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

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

You need to supply at least one validation

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

我的理解是validates与正常验证和validate自定义验证一起使用。是对的吗?还有其他我应该知道的吗?有没有办法让第一个问题大声失败而不仅仅是验证一切?

4

2 回答 2

81

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
于 2013-08-09T06:14:38.400 回答
10

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

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

def field 

end

在你的object. 由于 Railsattr_accessor为每个数据库定义了一个,field因此validate :field会调用field's reader 方法。

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

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

希望这是有道理的

于 2013-08-09T06:28:01.590 回答