我正在使用Ruby3.0.2,并试图使用ActiveRecord进行验证。
我希望验证用户输入,即字符串,但希望将输入的部分视为数字,这样我就可以对其应用一些逻辑。
输入需要如下所示
21-10
我将使用regex来确保这两个数字之间存在“-”,但我希望能够验证这些数字,以确保:
我面临的挑战是能够将字符串的部分处理为具有验证的数字。
输入的一个示例,它将是有效/无效的:
11-21 // valid
10-23 // invalid because 23 > 21
11-11 // invalid because neither numbers are 21
22-24 // valid because 22 & 24 within 2 of each other任何帮助都很感激!
发布于 2021-09-19 07:14:00
这可以用这样的自定义验证方法来完成:
# in the model
validate :range_string_has_validate_pattern
private
def range_string_has validate_pattern
parts = range_string.split('-') # assuming the attribute is named `range_string`
if parts.size != 2
errors.add(:range_string, "does not contain two parts separated by a '-'")
return
end
begin
parts[0] = Integer(parts[0])
parts[1] = Integer(parts[1])
rescue
errors.add(:range_string, "does not contain two numbers")
return
end
return if parts[0] == 21 || parts[1] == 21
return if (parts[0] - parts[1]).abs == 2
errors.add(:range_string, "does not match requirements")
end发布于 2021-09-20 09:24:36
我会选择模式匹配(是现代红宝石)和自定义验证器方法。
validates :your_attribute, format: { with: /\A\d+-\d+\z/ }
validate :string_format
def string_format
# do not attempt if the format is wrong
return if errors.where(:your_attribute).present?
case your_attribute.split('-').map(&:to_i)
in [..20, ..20]
error.add(:your_attribute, 'Both numbers are less than 21')
in [..20, 22..] | [22.., ..20]
error.add(:your_attribute, 'One is less the other is more')
in [22.. => x, 22.. => y] if y - x > 2 or x - y > 2
error.add(:your_attribute, 'Difference is too big')
else
return
end
endhttps://stackoverflow.com/questions/69240297
复制相似问题