我有一个条件表单字段(通过单击复选框显示),我想用自定义方法验证它。
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,或者执行自定义验证器),但我希望我所指出的将帮助您做出正确的决定,如何进一步做到这一点。
希望能有所帮助!