"验证"和"验证"之间有什么区别?

Luc*_*ain 52 validation ruby-on-rails

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

validate :field, presence: true
Run Code Online (Sandbox Code Playgroud)

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

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

You need to supply at least one validation
Run Code Online (Sandbox Code Playgroud)

我把它改成了validate,一切都按预期进行了.

我的理解是使用validates普通验证和validate自定义验证.是对的吗?还有其他我应该知道的部分吗?有没有办法让第一个问题大声失败而不只是验证一切?

rma*_*002 71

validates此方法是所有默认验证器和以"Validator"结尾的任何自定义验证器类的快捷方式.请注意,通过在其位置创建自定义验证程序类(如PresenceValidator),可以在特定类中覆盖Rails默认验证程序.

validates :title, :body, :presence => true
Run Code Online (Sandbox Code Playgroud)

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

validate :must_be_friends

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

  • 哦,我不知道“以 'Validator' 结尾的自定义验证器类”,这真是太好了。如果出现其他答案,我会将问题留待更长时间,但稍后我会回来接受。感谢您的解释! (2认同)

Vir*_*ren 10

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

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

def field 

end
Run Code Online (Sandbox Code Playgroud)

在你的object.由于Rails的定义attr_accessor为每一个数据库fieldvalidate :field会召唤field的读者法.

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

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

希望这是有道理的