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