了解Railsvalidation:allow_blank做了什么?

我是Rails的新手,发现了一个小片段来逐步validation存在和唯一性:首先检查存在,然后检查唯一性。

validates :email, :presence => true, :allow_blank => true, :uniqueness => { :case_sensitive => false } 

关于使用presence => trueallow_blank => true ,我有点困惑。

如果不使用allow_blank => true ,将同时检查两个规则,而不是逐步检查。

为什么allow_blank => true做这个魔术?

你得到的东西相当于此(为清晰起见而包裹):

 validates :email, :presence => true, :uniqueness => { :allow_blank => true, :case_sensitive => false } 

这有点愚蠢但是如果你要求存在,那么这将使“allow_blank”子句“无效”为:唯一性。

当你切换到使用其他validation器时更有意义..说…格式和唯一性,但你不想要任何检查,如果它是空白的。 在这种情况下,添加一个“全局应用”:allow_blank更有意义,DRY稍微提高了代码。

这个…

 validates :email, :format => {:allow_blank => true, ...}, :uniqueness => {:allow_blank => true, ...} 

可写成:

 validates :email, :allow_blank => true, :format => {...}, :uniqueness => {...} 

以下区别对于了解以下内容非常有用:

 presence: true # nil and empty string fail validation presence: true, allow_blank: true # nil fails validation, empty string passes 

:allow_blank是一个选项,它将“禁用”多个validation器,但不会禁用存在validation器。 将这两者结合使用的结果是,当字段留空时,您将得到:blank错误消息(即“不能为空”),而不是其他错误消息。

来自Rails注释

 # * :allow_nil - Skip validation if the attribute is +nil+. # * :allow_blank - Skip validation if the attribute is blank. 

所以,这意味着当我们在电子邮件中使用allow_blank时,如果电子邮件为nil,则只有一个错误添加到errors对象,跳转唯一性validation。

太多的解释只是让简单的事情变得更复杂,我们只想说:

 # do not use this validates to check if the value is blank