基于正则表达式的Rails自定义validation?

我有以下正则表达式,我在我的routes.rb中使用/ type-in​​-something-here

# AZ, az, 0-9, _ in the middle but never starting or ending in a _ # At least 5, no more than 500 characters 

在路线中,这适用于:

 match ':uuid' => 'room#show', :constraints => { :uuid => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/ } 

我想将此作为validation,因此不会创建无效记录。 所以我在room.rb中添加了以下内容:

 validates_format_of :uuid, :with => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/i, :message => "Invalid! Alphanumerics only." 

但是这个validates_format_of不起作用,而不是添加错误,它允许记录保存。

有什么想法有什么不对吗?

谢谢

出于validation目的,请记住添加字符串标记\A\Z的开头和结尾:

 validates_format_of :uuid, :with => /\A[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?\Z/i 

否则,你的正则表达式将很乐意匹配任何至少包含字母或数字的字符串。 出于某种原因,Rails隐含地添加了路由中的边界。 (可能是因为它将正则表达式嵌入到一个较大的内容中以匹配整个URL,并显式检查/和URL的结尾。)

使用这样的东西

 validates :uuid, :format => {:with => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/i}, :message => "your message" 

有关更多信息,请查看

 validates :name, format: { with: /\A[a-zA-Z]+\z/, message: "Only letters are allowed" }