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

Mis*_*hko 2 regex validation ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

它应该允许价格0999999.99.

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

:presence验证工作正常.

我在这里错过了什么?

von*_*rad 5

price列是一个浮点数,因此Rails会自动将字符串"hello"转换为float,如下所示"hello".to_f # => 0.0.然后将其转换回字符串"0.0",这显然与正则表达式匹配.

通常,在非字符串列上使用正则表达式是个坏主意.相反,使用validates_numericality_of.如果您想要与正则表达式相同的限制,请执行以下操作:

class Product < ActiveRecord::Base
  validates_numericality_of :price, :greater_than => 0, :less_than => 1000000
end
Run Code Online (Sandbox Code Playgroud)

它不仅更安全,而且更容易阅读和遵循.请注意,如果空白,它也会自动拒绝价格.