了解Rails验证:allow_blank做了什么?

Sle*_*vin 36 ruby-on-rails

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

validates :email, :presence => true, :allow_blank => true, :uniqueness => { :case_sensitive => false }
Run Code Online (Sandbox Code Playgroud)

我对使用presence => trueallow_blank => true一起感到有点困惑.

不使用allow_blank => true这两个规则将同时检查而不是一步一步.

为什么allow_blank => true这么神奇?

Den*_*nis 31

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

presence: true                    # nil and empty string fail validation
presence: true, allow_blank: true # nil fails validation, empty string passes
Run Code Online (Sandbox Code Playgroud)

  • 这个答案非常错!至少在Rails 5中. (8认同)
  • 这真的是真的吗?据我了解文档,allow_blank将跳过所有空值的验证.`nil`是一个空白值.对Rails 5的快速测试告诉我,`nil`不会使我的验证失败...... (6认同)

Phi*_*rom 28

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

validates :email, :presence => true, 
            :uniqueness => { :allow_blank => true, :case_sensitive => false }
Run Code Online (Sandbox Code Playgroud)

这有点傻,但是如果你要求存在,那么这将使"allow_blank"子句"无效":唯一性.

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

这个...

validates :email, :format => {:allow_blank => true, ...}, 
                  :uniqueness => {:allow_blank => true, ...}
Run Code Online (Sandbox Code Playgroud)

可写成:

validates :email, :allow_blank => true, :format => {...}, :uniqueness => {...}
Run Code Online (Sandbox Code Playgroud)


gra*_*ywh 6

:allow_blank是一个选项,将"禁用"几个验证器,但不是"存在验证器".将这两者结合使用的结果是,当字段留空时,您将收到:blank错误消息(即"不能为空"),但不会显示其他错误消息.