Vaildate 1 поле с несколькими вариантами - PullRequest
0 голосов
/ 05 февраля 2012

Итак, у меня есть приложение rails с полем url для встраивания видео на youtube и vimeo. Все работает нормально, но я не могу найти решение для проверки обоих полей, но только при использовании одного из них.

Пользователь выбирает URL-адрес видео и может выбрать vimeo или youtube, и после сохранения я хотел бы проверить правильность URL-адреса видео (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 Ответ

3 голосов
/ 05 февраля 2012

Вы можете объединить свои регулярные выражения в одно большое непонятное регулярное выражение или использовать собственный метод проверки:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...