如何验证字段为空字符串或正数值?Ruby on Rails验证求助
正确实现方案
你原代码的核心问题是逻辑完全颠倒:if选项的作用是指定何时触发当前验证规则,而你写的条件是“当字段为空字符串或正数值时,才验证presence: true”——但presence: true本身会拒绝空字符串,这就导致你的验证逻辑完全和需求相悖,自然无法生效。
要实现「参数必须是空字符串,或是大于0的数值」的验证,最清晰的方式是使用自定义验证方法:
validate :my_field_must_be_empty_string_or_positive_number private def my_field_must_be_empty_string_or_positive_number case my_field when String errors.add(:my_field, "必须是空字符串或正数值") unless my_field.empty? when Numeric errors.add(:my_field, "必须是空字符串或正数值") unless my_field > 0 else errors.add(:my_field, "必须是空字符串或正数值") end end
如果偏好使用Rails内置的验证器组合,也可以拆分规则来写:
# 字符串类型时,必须是空字符串 validates :my_field, inclusion: { in: [""], message: "必须是空字符串或正数值" }, if: -> { my_field.is_a?(String) } # 数值类型时,必须是正数 validates :my_field, numericality: { greater_than: 0, message: "必须是空字符串或正数值" }, if: -> { my_field.is_a?(Numeric) } # 非字符串/数值类型直接报错 validates :my_field, presence: { message: "必须是空字符串或正数值" }, unless: -> { my_field.is_a?(String) || my_field.is_a?(Numeric) }
两种方式都能实现需求:拒绝非空字符串、负值,以及不符合类型要求的参数。
内容的提问来源于stack exchange,提问作者Andres Carretero
相关产品推荐
相关产品推荐

