2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

正規表現でバリデーション設定した項目を空欄のままでも通過できるようにしたい

Last updated at Posted at 2020-05-17

はじめに

電話番号やメールアドレス等の入力値のフォーマットチェックに正規表現が使える。

指定した文字列、数列以外の値が入力されたらバリデーションチェックに引っ掛かる仕組みだ。

今回は任意入力とした項目を指定された正規表現、または空欄のままでもバリデーションが通過するようにしたい。

電話番号にバリデーションをかけてみよう

今回は電話番号を例にして、まずは電話番号にバリデーションをかけてみる
スクリーンショット 2020-05-17 17.37.14.png


validates :phone_number, format: { with: /\A\d{10,11}\z/ }

これはハイフンなしの10桁または11桁の半角数字で入力してくださいという意味の正規表現だ。

今回は電話番号は任意入力にしたいのでpresence: trueは書いてないし、このままでいいだろうと思ったが…。

問題発生

指定された正規表現でのバリデーションは突破し、次に入力欄を空白にして進んだらバリデーションに引っかかってしまった!
スクリーンショット 2020-05-17 17.40.01.png

原因

どうやら正規表現でバリデーションをかけるとその正規表現以外の入力をたとえ空欄(nil)でも受け付けなくなってしまうらしい。

解決法その1

メンターに聞いてみるとカスタムメソッドというのを用いて

「空か、あるいは10桁または11桁の半角数字」といったカスタムメソッドを作るという方法があると言われたが、カスタムメソッドについて調べると非常に面倒臭いし大変そうである。

↓カスタムメソッドの参考記事
https://qiita.com/h1kita/items/772b81a1cc066e67930e

なので自分で他の方法がないか考えて試行錯誤した結果、非常に簡単な解決法が見つかった。

解決法その2

以下のようにallow_blank: trueを追加するだけである。

validates :phone_number, format: { with: /\A\d{10,11}\z/ }, allow_blank: true

これは文字通り空欄のままでもOKという意味。

これで電話番号が未入力でもバリデーションが通るようになりました!

まとめ

入力値を正規表現、または空欄でバリデーションを通過したい場合はallow_blank: trueを追加すれば良い。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?