我遵循一些提示来验证字段的数字性,只有在存在时,使用:
validates_numericality_of :year, only_integer: true, allow_nil: true
或
validates_numericality_of :year, only_integer: true, allow_blank: true
但是我可以用'asdfasdf'
之类的年份来创建它,并且rails存储空白年份。
有什么不对?
答案 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
过滤器并使其失败。