#環境
ruby 2.6.5
rails 6.0.3
#前置き
今回実装したかった仕様はYouTubeの動画をユーザーが登録すること
その際にYouTube以外の動画サイトのURLを登録されると色々不都合が出てくるので
ユーザーが登録する動画URLはYouTubeのURLだけに限定したい
YouTubeのURLの特徴としては以下の2点
- PC版とスマホ版でURLの始まり方が異なる
- PC https://www.youtube.com/watch?v=
- スマホ https://youtu.be/
- URLの最後に11桁の動画識別番号?が割り振られている
なので今回はこの2点を考慮してYouTubeのURLを判定する正規表現を作成していく
#正規表現
そして完成したのがこちらのvalidation
validates :url, presence: true,
format: { with: /\A(https\:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/)+[\S]{11}\z/ }
正規表現だけ抜き出すとこんな感じ
/\A(https\:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/)+[\S]{11}\z/
これでYouTubeのURLのみデータベースに保存することが可能です。
rubyの場合はRubularというサイトで正規表現のチェックを行えます。
#ブラウザでの表示
ちなみに以下のようにすることでブラウザで動画を表示させる事が可能です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/<%= @exercise.url.last(11) %>"
frameborder="0" allow="accelerometer; autoplay; encrypted-media;
gyroscope; picture-in-picture" allowfullscreen>
</iframe>
@exercise = Exercise.find(params[:id])
#最後に
もうすこしうまく正規表現を書けば、最後の11文字だけを抽出して登録した方がいいかもです。
そうするとブラウザに表示するときに.last(11)
が不要になるので。
私はここまでかなり苦戦したので余力がありませんでした・・・笑
時間がある時にまた考えてみようと思います。
あと実は他にもYouTubeのURLの形式って色々あります。
下記のように再生リストのURLだと全然形式違ったり・・・
https://www.youtube.com/watch?v=APdS9YQUWro&list=RDVFdLm6gEEE4&start_radio=1
検証段階で他にも確か全然違うURLがあったりとしましたが大変なので今回はメイン2種類に絞りました。