Ruby on rails 十进制值的验证不会阻止输入任意字符串
我对我的类Ruby on rails 十进制值的验证不会阻止输入任意字符串,ruby-on-rails,ruby,activerecord,activeadmin,simple-form,Ruby On Rails,Ruby,Activerecord,Activeadmin,Simple Form,我对我的类产品的价格属性进行了验证: validates_numericality_of :price, greater_than_or_equal_to: 0.5, allow_blank: true 因此,当我输入一个太小的值时,我会收到一条验证消息: 但是,当我输入一个垃圾值,如字符串abcdefg时,模型会保存,但会将价格设置回nil 这是一个严重的错误,因为用户可能会输入100$,数据将丢失,而用户不会注意到 从myschema.rbs t.decimal "price", pr
产品的价格属性进行了验证:
validates_numericality_of :price, greater_than_or_equal_to: 0.5, allow_blank: true
因此,当我输入一个太小的值时,我会收到一条验证消息:
但是,当我输入一个垃圾值,如字符串abcdefg
时,模型会保存,但会将价格设置回nil
这是一个严重的错误,因为用户可能会输入100$
,数据将丢失,而用户不会注意到
从myschema.rb
s
t.decimal "price", precision: 10, scale: 2
我如何确保用户不能添加这样一个无效值?模型正在保存,因为您有allow\u blank:true
@max:这听起来似乎有道理,但abcdefg
不是有效值,因此不应保存IMHO,此外,0.01是另一个无效值,因此验证有效。其工作方式是将其转换为数字,例如使用to_f<代码>“abcdef”。to_f
返回nil
。问题:您是否尝试输入100$
以查看实际发生的情况?是的,但验证器的工作方式是使用Kernel.Float
转换原始值。如果不返回浮点值,则将该值设置为nil。如果你有allow_blank:true
它会短路,所以这是有效的。如果设置了值,但根本不是十进制/数字,则它不会向错误哈希中添加单独的错误。如果您需要这种确切的行为,您可能需要创建自己的验证器。