只有在提供了任何值的情况下,Rails表单才使用自定义方法进行验证



我有一个条件表单字段(通过单击复选框显示),我想用自定义方法验证它。

validates :number, length: { maximum: 20 }, if: :checksum_is_valid?
def checksum_is_valid?
  if !Luhn.valid?(number)
    errors.add(number, "is not valid.")
  end
end

是我的尝试。从技术上讲,这很好,但也会显示错误,即使我根本没有输入任何数字(因为该字段不是强制性的)。我知道如何使用自定义方法进行检查,但前提是用户提供了任何数字。

感谢

对于自定义验证器,可以使用validate而不是validates,然后在验证器方法中存在数字时移动检查:

validate :checksum_valid?
private
def checksum_valid?
  if number.present?
    errors.add(:number, "is not valid.") unless number_valid?
  end
end
def number_valid?
  number.length < 20 && Luhn.valid?(number)
end

您在代码中混合了两件事,所以让我帮助您更好地理解正在发生的事情。

1) 。条件验证:

validates :number, length: { maximum: 20 }, if: :checksum_is_valid?

通过这种方式,Rails期望模型实现方法checksum_is_valid?,该方法返回布尔值,并基于该值执行验证。类似的东西会起作用:

def checksum_is_valid?
  Luhn.valid?(number)
end

如果此方法返回true,Rails将执行:number不超过20的验证。

2) 。自定义验证:

使用此自定义方法时,可以构建自己的验证逻辑和错误。所以,如果你有你的方法:

def checksum_is_valid?
  if !Luhn.valid?(number)
    errors.add(number, "is not valid.")
  end
end

您应该配置您的验证器:

validate :checksum_valid?

不幸的是,从您的代码中还不清楚您想要实现什么(验证数字不超过20,或者执行自定义验证器),但我希望我所指出的将帮助您做出正确的决定,如何进一步做到这一点。

希望能有所帮助!

最新更新