使用多个选项验证1个字段

时间:2012-02-05 01:44:14

标签: ruby-on-rails ruby ruby-on-rails-3 validation

所以我有一个带有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视频,反之亦然。

以上两个代码都有效但只有一个,我怎么能这样做才能同时工作?

1 个答案:

答案 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