はじめに
電話番号やメールアドレス等の入力値のフォーマットチェックに正規表現が使える。
指定した文字列、数列以外の値が入力されたらバリデーションチェックに引っ掛かる仕組みだ。
今回は任意入力とした項目を指定された正規表現、または空欄のままでもバリデーションが通過するようにしたい。
電話番号にバリデーションをかけてみよう
今回は電話番号を例にして、まずは電話番号にバリデーションをかけてみる
validates :phone_number, format: { with: /\A\d{10,11}\z/ }
これはハイフンなしの10桁または11桁の半角数字で入力してくださいという意味の正規表現だ。
今回は電話番号は任意入力にしたいのでpresence: trueは書いてないし、このままでいいだろうと思ったが…。
問題発生
指定された正規表現でのバリデーションは突破し、次に入力欄を空白にして進んだらバリデーションに引っかかってしまった!
原因
どうやら正規表現でバリデーションをかけるとその正規表現以外の入力をたとえ空欄(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を追加すれば良い。