2012-01-13 51 views
16

我是很新,Rails和我现在整个这我不能和我的朋友谷歌:)Rails - 如何验证一个字段只有当另一个字段有一定的值?

在我的形式解决我有三个值中选择一个问题就来了:苹果香蕉樱桃。如果我从select中选择Apple我隐藏了另一个Select-和带有一些Javascript的文本字段,因为当选择Apple时,不需要再填写这两个字段。

所以,现在我有一个验证我的表单时提交的问题。 我发现一些类似的问题,例如在 的情况下“只验证一个字段,如果另一个为空。”

这个问题已经解决这样的:

validates_presence_of :mobile_number, :unless => :home_phone? 

所以我只是试着它突然出现在我的脑海里的第一件事:

validates_presence_of :state, :granted_at, :if => :type != 1 

但是当我运行它,我得到这个错误:

undefined method `validate' for true:TrueClass 

所以现在我也没弄明白怎么可以从中创建对象访问值... 预先感谢您的帮助,我希望我的问题并不像听起来那么明显:-)

回答

27

因为它是你需要将它包装在一个lambda或者一个Proc对象,像这样的可执行代码:

validates_presence_of :state, :granted_at, :if => lambda { |o| o.type != 1 } 

# alternatively: 
..., :if => lambda { self.type != 1 } 
..., :if => Proc.new { |o| o.type != 1 } 
..., :if ->(o) { o.type != 1 } 
+0

谢谢你为快速响应:)但什么包含这个块变量“o”?正在验证的对象? – TehQuila 2012-01-13 13:07:59

+0

是的,确切地说。也可以看看@ Hauleth的答案,您可以在其中找到解决问题的其他方法。权威性参考可以在Rails API文档中找到:http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html希望有所帮助。此外,我建议你谷歌“红宝石procs和块”了解这背后的基本(红宝石)积木。希望有所帮助。 – Matt 2012-01-13 19:17:21

21

您可以使用if标志和lambda:

validates_presence_of :state, :granted_at, :if => lambda {self.type != 1} 

或者只是创建私有方法:

validates_presence_of :state, :granted_at, :if => :valid_type? 

private 
def valid_type? 
    type != 1 
end 
1

虽然上面提到的方式是最好的做法,但你也可以把它简单的是这样的:

validates_presence_of :state, :granted_at, :if => "type!=1" 
1

建立在以前的答案,你也可以用更短的“箭头”语法

validates :state, :granted_at, presence: true, if: ->(o) { o.type != 1 } 
相关问题