質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Q&A

解決済

1回答

3095閲覧

railsモデルのカラムのバリデーションを複数用意したい

T.Adams

総合スコア40

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

0グッド

0クリップ

投稿2020/06/13 11:21

前提

RailsでYouTube動画を投稿するWebサイトを作成しております。
YouTubeのURLを指定し投稿する形式なのですが、ユーザはPCのみではなく、スマホアプリからの投稿も考慮したいと考えています。

実現したいこと

1つのカラムに2つのパターンの正規表現のバリデーションをかけたい。
なぜなら、YouTubeブラウザ版YouTube iOSアプリ版で、取得できるURLの形式が異なるためです。

詳細

投稿に用いるモデルであるpost.rbに以下の記述をしました。とりあえず、サーバの起動は正常におこなえました。

Ruby

1 VALID_YOUTUBE_URL_BROWSER = /(\Ahttps://www.youtube.com/watch?v=)+[\w+-]{11}\z/ 2 VALID_YOUTUBE_URL_MOBILE = /(\Ahttps://youtu.be/)+[\w+-]{11}\z/ 3 validates :youtube_url, format: { with: VALID_YOUTUBE_URL_BROWSER, message: "は公式サイトから取得してください"} 4 validates :youtube_url, format: { with: VALID_YOUTUBE_URL_MOBILE, message: "は公式サイトから取得してください"}

しかし、入力フォームから、値を入力すると、今まで成功していたVALID_YOUTUBE_URL_BROWSERでもエラーが出るようになりました。
バリデーションの指定方法が誤っているのか、それとも正規表現のバリデーションは複数行えないのか。もし分かる方いらっしゃいましたら、お力添えお願いします。

備考

  • ブラウザから取得したYouTubeのURLの形式

https://www.youtube.com/watch?v=WUaRHinvlv4

イメージ説明

  • スマホYouTubeアプリから取得したYouTubeのURLの形式(画像下部のコピーを押すとクリップボードにURLがコピーされる)

https://youtu.be/WUaRHinvlv4

イメージ説明

バージョン

  • Rails 5.2.4
  • Ruby 2.7.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一つのcolumnに複数のvalidationを書くと、両方通らないとerrorになります。
それを避けるには

  1. if: ブラウザ の様に if: optionで分ける
  2. validate :url_is_valid? として、 def url_is_valid? を書く
  3. 両方通る正規表現にする。

でしょうか。
3のれいとしては,一番手抜きは
/((\Ahttps://www.youtube.com/watch?v=)+[\w+-]{11}\z)|(/(\Ahttps://youtu.be/)+[\w+-]{11}\z)/
ちょっと縮めて
\Ahttps://(www.youtube.com/watch?v=)|(youtu.be/)[\w+-]{11}\z)/

ん?[\w+-] ってなに? 「\w か - が11個」なら [-\w]{11}ですが。
でも -って入る? \w{11} ではない?

投稿2020/06/14 00:08

winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.Adams

2020/06/14 04:44

ありがとうございます。 3の方法ですが、以下の記法で、正常に動作しました。以下の書き方でない場合は、「unmatched close parenthesis」が出てしまいましたため、下記を用いました。 VALID_YOUTUBE_URL = /\Ahttps://(www.youtube.com/watch?v=|youtu.be/)[\w+-]{11}\z/ [\w+-]ですが、URLにハイフンが入る場合があるため、このように記載しました。この場合は、[-\w]{11}でもいけますね。この方が正しいですかね。これでもバリデーションが通ったので、[-\w]{11}としました。
winterboum

2020/06/14 04:58

[ ] の中のハイフンはその前後の文字の間の文字全部という意味になりますa-zとすると小文字アルファベット26文字。ハイフンそのものを表すときは[の直後に入れる、というのが正しい作法です。
winterboum

2020/06/14 05:01

訂正 私のは古かったみたい。最後でもOKらしいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問