ActiveRecord validations 是Rails很方便的一项特性,由于它如此好用,我们经常使用它,让用户看着了不舒服的信息,比如下面所说的例子:
举个例子,比如现在我要在用户注册的时候验证 Social Security Number (SSN) ,一般代码会是这个样子的:
class User < ActiveRecord::Base validates_presence_of :ssn validates_length_of :ssn, :is => 9 validates_numericality_of :ssn validates_uniqueness_of :ssn validates_as_ssn :ssn # Checks if a reserved or special SSN was sent end
根据以上的配置,如果用户忘记填入SSN,那个页面上会显示4个错误提示信息:
问题是,用户只是没有填入SSN,我们应该只显示一条不为空的信息啊,为什么要将其它的不相关的信息也显示出来吓着了用户呢?
解决这个问题的方法很简单,我们可以使用 :allow_blank 选项,因此那其它的验证在SSN号为空的时候是不空触发的:
class User < ActiveRecord::Base validates_presence_of :ssn validates_length_of :ssn, :is => 11, :allow_blank => true validates_numericality_of :ssn, :allow_blank => true validates_uniqueness_of :ssn, :allow_blank => true validates_as_cpf :ssn, :allow_blank => true end
还可以使用Rails框架给Object添加的Object#with_options 这个方法:
class User < ActiveRecord::Base validates_presence_of :ssn with_options :allow_blank => true do |v| v.validates_length_of :ssn, :is => 11 v.validates_numericality_of :ssn v.validates_uniqueness_of :ssn v.validates_as_cpf :ssn end end
这以上举的只是一个例子,还有如 validates_confirmation_of :password ,只有在确认密码不为空的时候才验证confirmation