Rails:为什么“格式化”(正则表达式)validation失败?
我有以下产品价格validation:
class Product true, :format => PRICE_REGEX ... end
它应该允许价格从0
到999999.99
。
但是,如果我输入hello
,则validation通过,并将0.00
保存在数据库中。
但是:presence
validation工作正常。
我在这里想念的是什么?
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 }
也许问题在那里