2009-10-28 81 views
0

我有一个包含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 

回答

2

问题中的代码试图根据实例变量定义类方法。这是行不通的。另外:价格只是一个象征。除了它的内在价值之外,它永远不会有任何价值。在语法错误的结果如下:

: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 
+0

这会在'| item |'处给出错误。 – Ryan 2009-10-28 14:17:19

+0

对不起,这应该是块前的Proc.new。现在修复。 – EmFi 2009-10-28 17:14:54

+0

谢谢,这很好。 – Ryan 2009-10-28 21:11:54