我的产品型号中有一个小数price
字段,并且有一个简单的验证:
class Price < ActiveRecord::Base
...
validates_numericality_of :price
...
end
如果我错误地输入33.0p
,则会说:“价格不是数字”(我同意),并将输入字段的内容从33.0p
更改为33.0
。
因此,如果我输入33.0p
并快速按下提交按钮(认为一切正常),我将收到错误消息。然后我将查看输入字段以检查出错了什么。但是,在那里我会看到一个有效的数字(33.0
),我会问自己“有什么问题......?”。
有没有办法阻止Rails在验证失败时更改输入字段内容?
答案 0 :(得分:2)
另一种选择是使用read_attribute_before_type_cast
,即f.text_field(:price, :value => @product.read_attribute_before_type_cast(:price))
。
答案 1 :(得分:1)
原因与我对other question的回答相同; Rails在进程中的某个时刻将输入转换为浮点数,因此浮点值就是显示的内容。
我没有对此进行测试,但您可以尝试将文本字段的值覆盖为params[:product][:price]
。从理论上讲,这看起来像是:
f.text_field(:price, :value => (params[:product] ? params[:product][:price] : @product.price))