当我验证一个字符串的格式时,我会做:
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+)/
如何在我的模型中设置此验证?
您可以将这两个正则表达式合并为一个,但我认为您的意思是您有两个不同的表达式而不是两个相同的表达式:
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('|'))
}
我是一名优秀的程序员,十分优秀!