Ruby on rails Rails:Regex在数字格式验证中不起作用

Ruby on rails Rails:Regex在数字格式验证中不起作用,ruby-on-rails,validation,Ruby On Rails,Validation,在Rails 5验证中,我试图确保输入的浮点在小数点后最多有3位数字。我有一部分是跟在后面的 validates:modifier,presence:true,格式:{with://\A\d+(?:\。\d{0,3})?\z/},数值性:{小于:100} 但以下测试失败(使用gem): 不应允许值(12345.1234)。对于(:修饰符) 错误消息:当修饰符设置为12345.1234时,预期会出现错误,没有错误 即使以下测试成功: 应允许_值(12345.123)。对于(:修饰符) 应允许_值

在Rails 5验证中,我试图确保输入的浮点在小数点后最多有3位数字。我有一部分是跟在后面的

validates:modifier,presence:true,格式:{with://\A\d+(?:\。\d{0,3})?\z/},数值性:{小于:100}

但以下测试失败(使用gem):

不应允许值(12345.1234)。对于(:修饰符)

错误消息:
当修饰符设置为12345.1234时,预期会出现错误,没有错误

即使以下测试成功:

应允许_值(12345.123)。对于(:修饰符)
应允许_值(12345)。对于(:修饰符)
不应允许值(123456)。对于(:修饰符)

它可能与只对字符串起作用的正则表达式有关,而我正在使用的
:modifier
属性是以浮点形式出现的。所以我需要找到一种方法,在一个字符串化版本的float上运行验证

尝试以下操作:

validates :modifier, presence: true, format: { with: /\A\d+(\.\d{0,3})?$/ }, numericality: { less_than: 100_000}

您的
中的regex似乎无法验证

这个表达有效

/\A\d+(?:\.?\d{0,3})\z/
模型中

validates :modifier, presence: true, format: { with: /\A\d+(?:\.?\d{0,3})\z/ }, numericality: { less_than: 100_000}

问题是Rails是自动的,因为我的数据库将列设置为
decimal,精度为5,刻度为3

为了正确验证输入,我需要运行以下验证:

validates:modifier\u-before\u-type\u-cast,presence:true,格式:{with://\A\d+(?:\。\d{0,3})?\z/},数值性:{less\u-than:100\u-000}


我最相关的帮助最终来自这里:

这一功能适用于许多国家,您可以使用空格或不使用空格(
\s*
):

这是一份非详尽的清单,列出了它所服务的国家:比利时、克罗地亚、法国、德国、卢森堡、荷兰、波兰、罗马尼亚、西班牙。我用这个有用的工具在线检查了它


它不适用的国家之一是保加利亚

检查Rubular以测试正则表达式!我提供的正则表达式在Rubular上的工作与预期一样。失败的测试仍然失败,123456测试也失败。下面是一条重要的错误消息(我使用的是Rails 5):
ArgumentError:提供的正则表达式使用了多行锚(^或$),这可能会带来安全风险。您是想使用\A和\z,还是忘记添加:multiline=>true选项?
感谢您的反馈,请看一看@JayQuigley试试我更新的内容。当我测试123456时,它已经通过了测试,所以如果它不适合你,请告诉我,而这个代码片段可能会解决这个问题,包括一个提高你文章质量的解释。记住,你是在将来回答读者的问题,而不仅仅是现在提问的人!请在回答中添加解释,并说明适用的限制和假设。
validates :bank_account, allow_blank: true, uniqueness: true, format: { with: /\A[a-zA-Z]{2}[0-9]{2}\s*[a-zA-Z0-9]{4}\s*[0-9]{4}\s*([a-zA-Z0-9]?){0,12}\s*[0-9]{4}\z/}