根据在另一个输入中输入的内容验证输入 - Rails

时间:2009-10-28 04:58:08

标签: ruby-on-rails validation

我有一个包含3个text_fields的表单。我需要两个填充来进行计算。必须始终填写quantity。如果price为空,则必须填写cost,反之亦然。

我试过这个,但是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

1 个答案:

答案 0 :(得分:2)

问题中的代码试图基于实例变量定义类方法。这没办法。另外:价格只是一个象征。除了内部价值之外,它永远不会有任何价值。以下结果导致语法错误:

:price = nil
:price = anything

符号始终定义并具有内部值,该值设置为“:”后面的字符串文本。含义:price.nil?:price == nil永远不会成立。你会感到困惑,因为你看到:价格传递给其他类方法。真正发生的是这些方法采用符号并动态转换为要调用的实例方法名称,执行时的列名称,或者仅将其用作哈希中的键。

足够的为什么你在做什么不起作用。我们来谈谈如何解决它。

您想要使用validations的if和unless子句。这段代码完全符合您的要求。

# 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
相关问题