我试图为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
最佳答案 如果原始字符串值转换为整数,则将向下舍入.因此“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