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

Jus*_*zer 1 ruby validation ruby-on-rails ruby-on-rails-3

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

validates :link, :uniqueness => true,
               :format => { :with => (regular expression) }
Run Code Online (Sandbox Code Playgroud)

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

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

或vimeo视频:

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

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

tad*_*man 5

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

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

使用%r[...]而不是/.../省去你必须逃避所有斜杠.

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

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

然后验证这样的事情:

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