仅当存在(如果用户填写)不起作用时才验证数值

时间:2015-03-06 12:16:18

标签: ruby-on-rails ruby-on-rails-4

我遵循一些提示来验证字段的数字性,只有在存在时,使用:

validates_numericality_of :year, only_integer: true, allow_nil: true

validates_numericality_of :year, only_integer: true, allow_blank: true

但是我可以用'asdfasdf'之类的年份来创建它,并且rails存储空白年份。

有什么不对?

2 个答案:

答案 0 :(得分:4)

而不是allow_nil: true,请使用allow_blank: true

您还应该在视图中将text_field替换为number_field。使用number_field,如果您的字符不仅仅是数字,则会将其评估为nil。

答案 1 :(得分:1)

api dock中所述,validates_numericality_of通过尝试使用Kernel.Float(如果only_integer为false)将其转换为浮点数或将其应用于正则表达式/ \ A [+ - ]?\ d + \ Z /(如果only_integer设置为true)。

这就是为什么在你的情况下它不会失败,因为'asdfasdf'字符串被“转换为整数”。

如果您移除allow_nil,那么它将不允许存储nil值,它将失败:

validates_numericality_of :year, only_integer: true

如果您希望它失败但仍允许使用nil值,则可以始终使用before_validate过滤器并使其失败。