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

问题描述:

当我验证字符串的格式,我会做:如何在我的模型中正确设置此验证?

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('|')) 
    } 
+0

耶woops,固定错误... – 2011-04-27 22:30:52

+0

除了'v'之外,YouTube视频还可以有不同的参数吗? – 2011-04-27 22:42:50

+0

我觉得'v'是非常标准的,但你必须试验一下。除了缩写和其他随机论证之外,这正是我期望的。 – tadman 2011-04-27 23:08:51