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

我有以下产品价格validation:

class Product  true, :format => PRICE_REGEX ... end 

它应该允许价格从0999999.99

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

但是:presencevalidation工作正常。

我在这里想念的是什么?

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 

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

我没有对此进行测试,但是我从validation中看到的每个描述都使用:以这种方式格式化:

 validates :price, :presence => true, :format => { :with => PRICE_REGEX } 

也许问题在那里