Rails条件验证不起作用

时间:2012-04-30 18:23:42

标签: ruby-on-rails validation

我正在尝试执行以下操作:

  validates :price, :presence => true, :if => Proc.new {|p| p.available == true}
  validates :price, :presence => false, :if => Proc.new {|p| p.available == false}

因此,如果boolean:available为true,则:price必须存在,如果为false,则:price必须为nil。

但是当我在控制台中测试它时,它不起作用。关于我可能做错什么的任何想法?

2 个答案:

答案 0 :(得分:2)

是的,我不确定你现在可以叠加验证。但是,您可以从before_validation中执行您想要的操作。

class Foo
  before_validation :price_matches_available

  def price_matches_available
    available ? price.present? : price.nil?
  end
end

答案 1 :(得分:2)

根据您的评论和我能理解的内容,您有一个产品型号,并且只有在产品可用标志为真的情况下才能设置价格。

根据其他评论,我不认为你可以叠加验证......即使有可能在某种程度上,我也不认为有一个验证错误,如“价格不能设置”如果产品不可用“。

我的建议是只进行第一次验证,如果标志设置为false,则默默拒绝价格。首先通过javascript获得良好的UX(在检查布尔值时禁用输入),然后在回调中确保没有人篡改HTML。

红宝石部分可以这样:

class Product < ActiveRecord::Base

  validates   :price, presence: true, if: "available?"

  before_save :reject_price, if: "available? == false"

  private

  def reject_price
    self.price = nil
  end
end