使用多个Proc对象的验证问题

时间:2016-10-13 12:40:32

标签: ruby-on-rails ruby proc

我已对Proc进行验证并遇到问题

validates :subcategory, presence: true, 
if: Proc.new {|product| product.detail.blank?} && Proc.new { |product|  product.category.id != 16 }

我的问题是当我在第二次进程中true时,我的验证会被激活。

为什么会这样?它是否应该返回false,因为false && true=>false

3 个答案:

答案 0 :(得分:5)

我认为您最好使用单个proc对象:

validates :subcategory,
  presence: true,
  if: Proc.new { |product| product.detail.blank? && product.category.id != 16 }

答案 1 :(得分:4)

其他人评论了更好的方法来实现你想要的东西。我只是指出你的误解。

  

它应该返回false,因为false && true => false

不。实际上,它是Proc && Proc => Procproc1 && proc2 => proc2)。因此,由于&&运算符的工作方式(这发生在类加载时),您的第一个proc被忽略,并且永远不会被调用,甚至不会被调用。

答案 2 :(得分:2)

我建议使用以下方法:if。

validates :subcategory, presence: true, if: :my_cond?

def my_cond?
  detail.blank? && category.id != 16
end 

它使您的代码更清晰。如果你找到方法my_cond?的真正好名字,那么你的代码将更具可读性。