Rails - 如果另一个字段具有特定值,如何验证字段?

时间:2012-01-13 09:49:05

标签: ruby-on-rails ruby-on-rails-3 validation models

我是Rails的新手,我现在遇到了一个我无法与朋友谷歌解决的问题:)

在我的表单中,我选择了三个值: Apple Banana Cherry 。如果我选择 Apple ,则选择我隐藏另一个选择 - 和一个带有一些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

所以现在我没有找到如何从创建的对象访问值... 提前感谢您的帮助,我希望我的问题不像听起来那么明显: - )

4 个答案:

答案 0 :(得分:30)

因为它是可执行代码,所以需要将它包装在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 }

答案 1 :(得分:24)

您可以使用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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

在之前的答案的基础上,您还可以使用更短的箭头"语法

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