如何在我的模型中正确设置此验证?
问题描述:
当我验证字符串的格式,我会做:如何在我的模型中正确设置此验证?
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('|'))
}
耶woops,固定错误... – 2011-04-27 22:30:52
除了'v'之外,YouTube视频还可以有不同的参数吗? – 2011-04-27 22:42:50
我觉得'v'是非常标准的,但你必须试验一下。除了缩写和其他随机论证之外,这正是我期望的。 – tadman 2011-04-27 23:08:51