我的模型有友好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
欢呼声
答案 0 :(得分:3)
目前的正则表达式:
/\A[^\s!#$%^&*()()=+;:'"\[\]\{\}|\\\/<>?,]+\z/
匹配除否定字符类 [^...]
中指定的符号以外的任何字符串。因此,由于没有数字,字符串中允许使用数字,并且可以有1+个数字,正则表达式将匹配该仅数字的数据。
要限制此模式以排除匹配的仅限数字的模式,只需在(?!\d+\z)
锚点之后添加\A
前瞻:
/\A(?!\d+\z)[^\s!#$%^&*()()=+;:'"\[\]\{\}|\\\/<>?,]+\z/
^^^^^^^^^
请参阅regex demo(多行,因此,使用^
/ $
定位符,您需要在ROR中使用\A
和\z
此前瞻将在字符串的开头执行一次,并且当它断言(=匹配)仅数字(1或更多)直到字符串的结尾时将返回false。