我对产品的价格进行了以下验证:
class Product < ActiveRecord::Base
...
PRICE_REGEX = /^([1-9]\d{0,5}|0)(\.\d{1,2})?$/
validates :price, :presence => true, :format => PRICE_REGEX
...
end
它应该允许价格从0
到999999.99
。
但是,如果我输入hello
,则验证通过,0.00
将保存在数据库中。
:presence
验证工作正常。
我在这里缺少什么?
答案 0 :(得分:5)
price列是一个浮点数,因此Rails会根据"hello".to_f # => 0.0
自动将字符串“hello”转换为float。然后将其转换回字符串"0.0"
,这显然与正则表达式匹配。
通常,在非字符串列上使用正则表达式是个坏主意。相反,请使用validates_numericality_of
。如果你想要与正则表达式相同的限制,可以这样做:
class Product < ActiveRecord::Base
validates_numericality_of :price, :greater_than => 0, :less_than => 1000000
end
它不仅更安全,而且更容易阅读和遵循。请注意,如果空白,它也会自动拒绝价格。
答案 1 :(得分:0)
我没有对此进行过测试,但是我从验证中看到的每个描述都使用:以这种方式格式化:
validates :price, :presence => true, :format => { :with => PRICE_REGEX }
可能存在问题