了解Railsvalidation:allow_blank做了什么?
我是Rails的新手,发现了一个小片段来逐步validation存在和唯一性:首先检查存在,然后检查唯一性。
validates :email, :presence => true, :allow_blank => true, :uniqueness => { :case_sensitive => false }
关于使用presence => true
和allow_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