如何在模型中正确设置此验证?

时间:2011-04-27 22:15:39

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

当我验证字符串的格式时,我会这样做:

validates :link, :uniqueness => true,
               :format => { :with => (regular expression) }

我希望该链接可以是此正则表达式的YouTube视频:

/^http:\/\/www\.youtube\.com\/watch\?v=([a-zA-Z0-9_-]*)/

或vimeo视频:

/^http:\/\/www\.vimeo\.com\/(\d+)/

如何在我的模型中设置此验证?

1 个答案:

答案 0 :(得分:5)

你可以将这两个正则表达式合并为一个,但我认为你的意思是你有两个不同的表达式而不是两个相同的表达式:

validates :link,
  :uniqueness => true,
  :format => {
    :with => %r[http://(?:www\.youtube\.com/watch\?v=(\w+)|www\.vimeo\.com...)]
  }

使用%r[...]代替/.../可以避免必须转义所有斜杠。

另请注意,YouTube可能会使用youtu.be域名,因此您的正则表达式可能还需要另一部分。如果这件事情完全失控,你可能想采取不同的方法,并有一个你比较它的正则表列表:

VALID_URLS = [
  %r[http://www\.youtube\.com/watch\?v=(\w+)],
  %r[http://www\.youtu\.be/(\w+)],
  %r[ ... ]
]

然后验证这样的事情:

validates :link,
  :uniqueness => true,
  :format => {
    :with => Regexp.new(VALID_URLS.join('|'))
  }