用整数编写rails验证器

时间:2010-03-19 00:21:55

标签: ruby-on-rails ruby validation

我正在尝试为Rails编写验证,以确保在表单上输入的价格大于零。它的工作......有点儿。问题是,当我运行它时,val变成一个整数,所以它认为.99小于.1。发生了什么,我该如何修复代码?

class Product < ActiveRecord::Base
  protected
    def self.validates_greater_than_zero(*attr_names)
      validates_each(attr_names) do |record, attr, val|
        record.errors.add(attr, "should be at least 0.01 (current val = #{val.to_f})") if val.nil? || val < 0.01
      end
    end
  public
  validates_presence_of :title, :description, :image_url
  validates_numericality_of :price
  validates_greater_than_zero :price
end

2 个答案:

答案 0 :(得分:1)

如果将原始字符串值强制转换为整数,则将向下舍入。因此“0.99”向下舍入为0,显然小于0.01。您应该与原始字符串进行比较,您可以从<attr>_before_type_cast方法获得该字符串。

这样的事情应该有效:

validates_each(attr_names) do |record, attr, val|
  if record.send("#{attr}_before_type_cast").to_f < 0.01
    record.errors.add(attr, "error message here")
  end
end

答案 1 :(得分:1)

您可以更改

validates_numericality_of :price

validates_numericality_of :price, :greater_than_or_equal_to => 0.01

它似乎可以执行validates_greater_than_zero验证程序想要执行的操作。