所以我有一个带有url字段的rails应用程序,用于嵌入youtube和vimeo视频。一切正常但我无法找到验证这两个字段的解决方案,但只有在使用一个字段时才能找到。
用户选择视频网址并可以选择使用vimeo或youtube,保存后我想验证视频的网址代码(youtube或vimeo)是否正确。
这就是我所拥有的
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视频,反之亦然。
以上两个代码都有效但只有一个,我怎么能这样做才能同时工作?
答案 0 :(得分: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