首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅当另一个字段为空时才验证字段是否存在- Rails

仅当另一个字段为空时才验证字段是否存在- Rails
EN

Stack Overflow用户
提问于 2011-06-08 09:21:02
回答 6查看 52.7K关注 0票数 63

我有一张表格,上面有一个手机/手机号码和一个家庭电话号码。

如果手机号码留空了,我想只验证手机/手机号码的存在,反之亦然。

我目前对这些字段的验证如下所示。

代码语言:javascript
复制
validates_presence_of :mobile_number
validates_presence_of :home_phone

validates_length_of :home_phone, :minimum => 12, :maximum => 12
validates_length_of :mobile_number, :minimum => 10, :maximum => 10, :allow_blank => true

validates_format_of :home_phone, :with => /\A[0-9]{2}\s[0-9]{4}\s[0-9]{4}/, :message => "format should be 02 9999 9999"

我想我可以像下面这样做,但不确定具体怎么做。

代码语言:javascript
复制
validates_presence_of :mobile_number, :unless => :home_phone.blank?

我使用的是Rails3。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-06-08 10:01:47

你不需要lambda。这样就可以了:

代码语言:javascript
复制
validates_presence_of :mobile_number, :unless => :home_phone?

此外,所有的验证器都采用相同的if/ all选项,因此您可以随意将其设置为有条件的。

更新:几天后回顾这个答案,我发现我应该解释为什么它是有效的:

  • 如果将验证器的:unless选项设置为符号,Rails将查找同名的实例方法,在验证时在被验证的实例上调用该方法,并且仅在该方法返回时才执行验证。Rails会自动为模型的每个属性创建问号方法,因此如果模型的表中存在home_phone列,Rails就会创建一个方便的#home_phone?方法。当且仅当home_phone存在(即不为空)时,此方法返回true。如果home_phone属性为nil、空字符串或一堆空格,home_phone?将返回false。

更新:确认这项旧技术继续在Rails5中工作。

票数 129
EN

Stack Overflow用户

发布于 2011-06-08 09:25:29

您必须使用lambda / Proc对象:

代码语言:javascript
复制
validates_presence_of :mobile_number, :unless => lambda { self.home_phone.blank? }
票数 23
EN

Stack Overflow用户

发布于 2017-11-08 01:13:46

从Rails4开始,您可以将一个块传递给presence。简明扼要:

代码语言:javascript
复制
validates :mobile_number, presence: {unless: :home_phone?}

此外,对于nil或空,:home_phone?将返回false。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6273289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档