2012-02-05 32 views
0

所以我有一個用於嵌入youtube和vimeo視頻的url字段的rails應用程序。一切工作正常,但我找不到解決方案來驗證這兩個領域,但只有當使用。Vaildate 1字段有多個選項

用戶選擇一個視頻url,並有選擇使用vimeo或youtube,並保存時,我想驗證視頻(youtube或vimeo)的url代碼是正確的。

這是我

YouTube的驗證碼

validates :url , 
:format => {:with => /(https?):\/\/(www.)?(youtube\.com\/watch\?v=|youtu\.be\/)([A-Za-z0-9_-]*)(\&\S+)?.*/} 

Vimeo的驗證碼

validates :url , 
:format => {:with => /http:\/\/(www.)?vimeo\.com\/([A-Za-z0-9._%-]*)((\?|#)\S+)?/} 

當我有YouTube的代碼,我無法保存VIMEO視頻,反之亦然。

上述兩種代碼都可以使用,但只有一種,我怎麼能夠使它們同時工作?

回答

3

你可以混搭你的正則表達式連成一個大的不可理解的正則表達式或者你可以使用一個自定義的驗證方法:

validate :youtube_or_vimeo_url 

private 

def youtube_or_vimeo_url 
    return if(self.url =~ /\A(https?):\/\/(www.)?(youtube\.com\/watch\?v=|youtu\.be\/)([A-Za-z0-9_-]*)(\&\S+)?.*/) 
    return if(self.url =~ /\Ahttp:\/\/(www.)?vimeo\.com\/([A-Za-z0-9._%-]*)((\?|#)\S+)?/) 
    errors.add(:url, 'Bad video URL etc.') 
end 

你也可以用這種方法分離的兩個YouTube模式和得到的代碼更易於閱讀。

雖然我在這裏,如果你使用了很多在你的正則表達式斜線,你可能想使用%r{}代替:

def youtube_or_vimeo_url 
    return if(self.url =~ %r{\A(https?)://(www.)?(youtube\.com/watch\?v=|youtu\.be/)([A-Za-z0-9_-]*)(\&\S+)?.*}) 
    return if(self.url =~ %r{\Ahttp://(www.)?vimeo\.com/([A-Za-z0-9._%-]*)((\?|#)\S+)?}) 
    errors.add(:url, 'Bad video URL etc.') 
end 
相關問題