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

时间:2011-10-06 21:38:06

标签: ruby-on-rails ruby regex ruby-on-rails-3

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

# A-Z, a-z, 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])?/ }

我想将此作为验证,因此不会创建无效记录。所以我将以下内容添加到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不起作用,而不是添加错误,它允许记录保存。

任何想法有什么不对?

谢谢

3 个答案:

答案 0 :(得分:17)

出于验证目的,请务必添加字符串标记\A\Z的开头和结尾:

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

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

答案 1 :(得分:11)

使用类似的东西

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

有关详情this

答案 2 :(得分:5)

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