当一个字段可能为零时,验证是否存在两个字段之一

时间:2017-07-25 00:25:46

标签: ruby-on-rails validation

我刚遇到Validate presence of field only if another field is blank - Rails已接受的解决方案尚未完成的情况。

我想要存在两个字段中的一个或两个,但在我的情况下,字段points中的一个字段需要是0到10之间的数字。在点字段为零的情况下{ {1}}评估为false,空白评论被视为无效。我通过指定:points?

尝试使其更具体一些
:points.blank?

这似乎有效(我可以保存第一个条目0点而没有评论)但是在后续保存中我从控制器那里得到了奇怪的错误:

  

NoMethodError(未定义的方法'验证'表示false:FalseClass):   app / controllers / comments_controller.rb:8:在'创建'

我需要对验证做些什么吗?我是否需要使用lambda(如链接问题的一些答案所示)?

2 个答案:

答案 0 :(得分:2)

:points.blank?计算为false,其被设置为哈希中:unless项的值。您需要为:unless选项指定方法名称或Proc。您可以简化整个设置:

validates :comment, presence: true, on: :create, if: :points?
validates :points, numericality: :only_integer, inclusion: 0..10

答案 1 :(得分:0)

不确定你是如何获得第一个记录的,但这不是正确的语法:

  

验证:评论,在场:{除非:: points.blank?,on :: create}

相反,您应该在模型中定义这样的方法:

def points_blank?
  # your code for zero handling
  # 
end

然后使用该方法,除非像这样:

validates :comment, presence: { unless: :points_blank?, on: :create }