「英数6文字以内」「全角のみ使用可能」「空欄ではエラーになる」というバリデーションをかけた


2020/10/21更新

結論

以下を利用した。

with_options

条件付きバリデーションをグループ化できる。do endで囲って使用する。

presence: true

空でないことを確認する。

format:

withオプションに記述した正規表現が送られた値とマッチしているか検証する。

/\A[ぁ-んァ-ン一-龥]+\z/

Unicodeにおける範囲でひらがな、カタカナ、漢字と一致しているか調べる。これらでは不完全だが、一般的な日本人用としては十分だと思われる。

追記
ゔまで含めたければ、[ぁ-ゔ]
ヴまで含めたければ、[ァ-ヴ]
https://qiita.com/kokorinosoba/items/78811d7e2b6bc424b1b1

漢字の抜け漏れを無くしたい場合には[\p{Han}]
※\P{Han} は漢字以外だそうです。
日本語中国語韓国語ベトナム語の感じ全てを含めたい場合には[\p{Ideographic}]
です。
使い方は数字の[\d]と同じように[a-z\p{Han}]のように使えます。

/[a-z\d]{6,}/i

大文字小文字可能で、英字もしくは数字6文字以上であるか確認する。
これはアルファベット(大小問わず)または数字が6文字以上含まれているかチェックするもの。
英字かつ数字が必ず含まれているかチェックするには以下の表現が必要。

\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i

?=はそれ以降の文字列の中から[a-z]があるかを調べる。という意味。
これがないと先頭の文字1文字をみて判断してしまう。

理解が進んだら更新します。

{6,20}とすれば6文字以上20字いないと指定できる。

message

ここにエラーの時に出るメッセージを記述する。

不足しているコード

models/user.rb
  with_options presence: true, format: { with: /\A[ぁ-んァ-ン一-龥]+\z/, message: 'に全角文字を使用してください' } do
    validates :family_name
    validates :first_name
  end

  validates :password, format: { with: /[a-z\d]{6,}/i, message: "は6文字以上の英数字が使えます" }

end

十分なコード

model/user.rb
  with_options presence: true, format: { with: /\A[ぁ-ゔァ-ヴ\p{Ideographic}a-zA-Z0-9]+\z/, message: 'に全角文字を使用してください' } do
    validates :family_name
    validates :first_name
  end

  validates :password, format: { with: /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i, message: "は6文字以上かつ英数字をそれぞれ含めてください" }

end
全角のバリデーション結果

英数混合必須

参考文献

Railsガイドのformatヘルパーの欄をご覧ください。
https://railsguides.jp/active_record_validations.html
基本的な正規表現一覧
https://murashun.jp/blog/20190215-01.html
runyの正規表現チェッカー
https://rubular.com/