Rails:为什么“格式化”(正则表达式)验证失败?

时间:2010-12-17 02:40:07

标签: ruby-on-rails regex validation ruby-on-rails-3

我对产品的价格进行了以下验证:

class Product < ActiveRecord::Base
    ...
    PRICE_REGEX = /^([1-9]\d{0,5}|0)(\.\d{1,2})?$/
    validates :price, :presence => true, :format => PRICE_REGEX
    ...
end

它应该允许价格从0999999.99

但是,如果我输入hello,则验证通过,0.00将保存在数据库中。

:presence验证工作正常。

我在这里缺少什么?

2 个答案:

答案 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 }

可能存在问题