根据在另一个输入中输入的内容验证输入 - Rails
问题描述:
我有一个包含3个text_fields组的表单。我需要填写其中的两个来进行计算。 quantity
必须始终填写。如果price
为空,则必须填写cost
,反之亦然。根据在另一个输入中输入的内容验证输入 - Rails
我试过了,但price
从来没有零,即使我把它留空。我也尝试:price == nil
和:price.blank?
,但他们做同样的事情。
# app/models/item.rb
validates_numericality_of :cost, :greater_than => 0
if :price.nil?
validates_numericality_of :quantity, :greater_than => 0
else
validates_numericality_of :price, :greater_than => 0
end
答
问题中的代码试图根据实例变量定义类方法。这是行不通的。另外:价格只是一个象征。除了它的内在价值之外,它永远不会有任何价值。在语法错误的结果如下:
:price = nil
:price = anything
符号总是定义且有一个内部的值,其被设置为文本字符串之后的“:”。含义:price.nil?
和:price == nil
永远不会成立。你会感到困惑,因为你看到:价格传递给其他类方法。真正发生的是这些方法使用符号并动态地变成要调用的实例方法名称,执行时的列名称,或者仅将其用作哈希中的键。
足够了解为什么你在做什么不行。我们来谈谈如何解决它。
你想使用if和unless子句为validations。这段代码完全符合你的要求。
# app/models/item.rb
validates_numericality_of :cost, :greater_than => 0
validates_numericality_of :quantity, :greater_than => 0,
:if => Proc.new {|item| item.price.nil?}
validates_numericality_of :price, :greater_than => 0,
:unless => Proc.new {|item| item.price.nil?}
end
这会在'| item |'处给出错误。 – Ryan 2009-10-28 14:17:19
对不起,这应该是块前的Proc.new。现在修复。 – EmFi 2009-10-28 17:14:54
谢谢,这很好。 – Ryan 2009-10-28 21:11:54