Rails4:模型验证 slug 列的“格式”正则表达式
Posted
技术标签:
【中文标题】Rails4:模型验证 slug 列的“格式”正则表达式【英文标题】:Rails4 : model validates "format with" regex for slug column 【发布时间】:2016-06-30 12:42:10 【问题描述】:我的模型有带有友好 ID gem 的 slug,有时用户只输入数字 slug 并且在访问页面时遇到问题。 然后我想更改模型验证,除了只有数字和一些特殊字符。
这是当前验证的模型
validates :slug, presence: true, length: maximum: 200 , uniqueness: true,
format: with: /\A[^\s!#$%^&*()()=+;:'"\[\]\\|\\\/<>?,]+\z/, message: :invalid_slug
如何在此处添加??
示例:
当前:
'123' => valid
'abc' => valid
'adb?&' => invalid
新:
'123' => invalid
'abc' => valid
'adb?&' => invalid
干杯
【问题讨论】:
您想在 slug 中包含所有特殊字符(除了 ? 和 &)还是只包含下划线和连字符? 如何从输入中生成 slug?为什么在生成 slug 时不处理这种情况? 所以,只需将数字添加到否定字符类:/\A[^0-9\s!#$%^&*()()=+;:'"\[\]\\|\\\/<>?,]+\z/
- 这不是您需要的吗?或者您是否想允许数字 + 其他内容并希望禁止仅数字的 slug?然后使用/\A(?!\d+\z)[^\s!#$%^&*()()=+;:'"\[\]\\|\\\/<>?,]+\z/
。
【参考方案1】:
当前正则表达式:
/\A[^\s!#$%^&*()()=+;:'"\[\]\\|\\\/<>?,]+\z/
匹配任何仅包含 1+ 个符号的字符串,而不是在 否定字符类 [^...]
中指定的符号。因此,由于没有数字,因此字符串中允许使用数字,并且可以有 1 个以上的数字,并且正则表达式将匹配该仅数字的 slug。
要限制此模式以排除匹配的仅限数字的 slug,只需在 \A
锚之后添加一个 (?!\d+\z)
前瞻:
/\A(?!\d+\z)[^\s!#$%^&*()()=+;:'"\[\]\\|\\\/<>?,]+\z/
^^^^^^^^^
查看regex demo(多行,因此,使用^
/ $
锚点,您需要在ROR 中使用\A
和\z
)
此先行将在字符串的开头执行一次,当它断言(=匹配)直到字符串末尾的数字(1 个或更多)时,将返回 false。
【讨论】:
以上是关于Rails4:模型验证 slug 列的“格式”正则表达式的主要内容,如果未能解决你的问题,请参考以下文章