1

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

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

因此,如果布尔值 :available 为真,则 :price 必须存在,如果为假,则 :price 必须为 nil。

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

4

2 回答 2

2

是的,我不确定你现在可以堆叠验证。但是,您可以通过 before_validation 做您想做的事情。

class Foo
  before_validation :price_matches_available

  def price_matches_available
    available ? price.present? : price.nil?
  end
end
于 2012-04-30T19:32:06.650 回答
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
于 2012-05-07T12:26:20.267 回答