2011-04-27 71 views
1

當我驗證字符串的格式,我會做:如何在我的模型中正確設置此驗證?

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+)/

如何建立在我的模型這個驗證?

回答

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

相關問題