Rails4:模型验证slug列的“格式与”正则表达式

时间:2016-03-15 07:38:32

标签: ruby regex ruby-on-rails-4 slug

我的模型有友好ID宝石的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

欢呼声

1 个答案:

答案 0 :(得分:3)

目前的正则表达式:

/\A[^\s!#$%^&*()()=+;:'"\[\]\{\}|\\\/<>?,]+\z/

匹配除否定字符类 [^...]中指定的符号以外的任何字符串。因此,由于没有数字,字符串中允许使用数字,并且可以有1+个数字,正则表达式将匹配该仅数字的数据。

要限制此模式以排除匹配的仅限数字的模式,只需在(?!\d+\z)锚点之后添加\A前瞻:

/\A(?!\d+\z)[^\s!#$%^&*()()=+;:'"\[\]\{\}|\\\/<>?,]+\z/
   ^^^^^^^^^

请参阅regex demo(多行,因此,使用^ / $定位符,您需要在ROR中使用\A\z

此前瞻将在字符串的开头执行一次,并且当它断言(=匹配)仅数字(1或更多)直到字符串的结尾时将返回false。