テストコードを調べながらコーディングしていたら結局、バリデーションかけ忘れが発覚してバリデーションを調べていく羽目になりました。とほほ
参考
目的
テストコードとして
・パスワードは英数混合かつ半角以外は登録できない
・名前(姓・名で分割入力)は漢字・ひらがな・全角カタカナ以外は登録できない
・読みがな(姓・名分割入力)は全角カタカナ以外登録できない
としたい
できればある程度DRY(繰り返しを避ける)ためにコードもまとめたい
疑問1
空欄しない「presence :trueは浮かぶが全角カタカナで登録という文字指定・文字サイズ指定はどうするのか?
*(参考)バリデーションを定義すると、下記のメソッドが動く前に必ず検証が行われます。
save/create/update
length(文字数制限)
#最低でも3文字以上
validates :カラム名, length: { minimum: 3 }
#3文字以内
validates :カラム名, length: { maximum: 3 }
#5文字から10文字以内
validates :カラム名, length: { in: 5..10 }
#6文字ピッタリ
validates :カラム名, length: { is: 6 }
オプション名 | 内容 |
---|---|
minimum | 最小値を指定 |
maximum | 最大値を指定 |
in | 長さの範囲を指定 |
is | 値の長さを指定 |
format
正規表現とフォーマットに入力された値が合致するかの検証
withオプションと併用して使用
下は全角カタカナのみを許可したバリデーション
validates :name, format: { with: /\A[ァ-ヶー-]+\z/ }
指定型 | 指定方法 |
---|---|
全て数値(半角) | /\A[0-9]+\z/ |
半角アルファベット(小文字) | /\A[a-z]+\z/ |
半角アルファベット(大文字) | /\A[A-Z]+\z/ |
半角アルファベット(大文字・小文字) | /\A[a-zA-Z]+\z/ |
半角アルファベット(小文字・数値) | /\A[a-z0-9]+\z/ |
半角アルファベット(大文字・数値) | /\A[A-Z0-9]+\z/ |
全角ひらがな | /\A[ぁ-んー-]+\z/ |
全角カタカナ | /\A[ァ-ヶー-]+\z/ |
全角ひらがな、カタカナ | /\A[ぁ-んァ-ヶー-]+\z/ |
半角カナ | /\A[ァ-ン゙゚]+\z/ |
漢字 | /\A[一-龥]+\z/ |
全角ひらがな、漢字 | /\A[一-龥ぁ-ん]/ |
全角ひらがな、全角カタカナ、漢字 | /\A[ぁ-んァ-ン一-龥]/ |
(参考)Rubyのバリデーション用正規表現集
正規表現 | 意味 |
---|---|
/\A\d{3}[-]\d{4}\z/ | 郵便番号(「-」を含む且つ7桁) |
greater_than_or_equal_to: 〇〇 | 〇〇と同じか、それ以上の数値 |
less_than_or_equal_to: △△ | △△と同じか、それ以下の数値 |
formatオプション
モデルのクラスの中でvalidatesメソッドを使用する際に利用できるオプションです。format: {with: 正規表現, message: 正規表現にマッチしなかった場合のエラーメッセージ}とすることで、特定のカラムへ正規表現を用いた入力制限をすることができます。
今回設定するバリデーションでは、以下の通りの正規表現を使います。
完成したバリデーション
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
with_options presence: true do
validates :nickname, :birthday, :password_confirmation
validates :first_name, :last_name, format: { with: /\A[ぁ-んァ-ン一-龥々]/, message: "は全角ひらがな、全角カタカナ、漢字で入力して下さい" }
validates :last_name_prono, :first_name_prono, format: { with: /\A[ァ-ヶー-]+\z/, message: "は全角カタカナで入力して下さい" }
end
validates :password, :password_confirmation,
format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: "は半角英数で入力して下さい" }
end
with_options〜endで同じバリデーションをまとめているのですが、
上の方のdeviseの:validatableでパスワードの空登録禁止のバリデーションはかかっているので
with_options〜endで同じバリデーションをまとまりの中から外しています。バリデーションが2回かかり
同じメッセージ「Email cant't be blank」が2度出ないようにしています。
パスワードのwithの部分ですが
format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: "は半角英数で入力して下さい" }
詳しく知りたい方は
@momotaro98さんのパスワード向け正規表現 /^(?=.?[a-z])(?=.?\d)[a-z\d]{8,100}$/i を解読するを参考にしてみてください。とっても詳しいです。