エラーメッセージの重複①
form_withメソッドを使って、
form.number_fieldで数値を入力させるフォームを作った。
正しい数値を入力すればエラーは起きないし、バリデーションを超える数値を入力しようとすると、そのタイミングでエラーが出る。
しかし、空のまま入力フォームを送ると、
○○を入力してください
○○は不正な値です
○○は一覧にありません
と、エラーが3つも出てしまう。
空を送信しただけで、3つもいらん!!!
解決方法
with_options presence: true do
validates :grade, format: { with: /\A[0-9]+\z/, allow_blank: true}, inclusion: { in: 1..7, allow_blank: true }
validates :class_number, format: { with: /\A[0-9]+\z/, allow_blank: true }, inclusion: { in: 1..10, allow_blank: true }
end
formatは正規表現のバリデーション。
inclusionは数値の範囲のバリデーション。
allow_blank: true
は値が空の場合はバリデーションを実行しないメソッド。
冗長だが、これで空のときにはformatとinclusionのバリデーションは反応しない。
改めてエラーメッセージを見ると、
「○○は不正な値です」はformatに反応していて、
「○○は一覧にありません」はinclusionに反応していることがわかる。
エラーメッセージの重複②
外部キーを使っている状態で、そこにpresence: true
のバリデーションをかけると、同じような内容で2つのエラーメッセージが出る。
解決方法
モデルに記述している、外部キーのバリデーションを消す。
【余談】エラーメッセージの順番を変えたい
順番はバリデーションとアソシエーションの記述位置を変える事で解消できる。記述の位置を変えるだけなので、特段問題が起こらないことが有難い。
これは、コードが上から読み込まれていることに起因すると考えられる。ちょっとしたことだけど、入力フォームの順に、エラーメッセージを出してあげたい。