我正在尝试执行以下操作:
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。
但是当我在控制台中测试它时,它不起作用。关于我可能做错什么的任何想法?
答案 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