LoginSignup
3
3

More than 3 years have passed since last update.

エラーメッセージの重複をなくしたい

Posted at

エラーメッセージの重複①

form_withメソッドを使って、
form.number_fieldで数値を入力させるフォームを作った。
正しい数値を入力すればエラーは起きないし、バリデーションを超える数値を入力しようとすると、そのタイミングでエラーが出る。
しかし、空のまま入力フォームを送ると、


○○を入力してください
○○は不正な値です
○○は一覧にありません


と、エラーが3つも出てしまう。
空を送信しただけで、3つもいらん!!!

解決方法

model
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つのエラーメッセージが出る。

解決方法

モデルに記述している、外部キーのバリデーションを消す。

【余談】エラーメッセージの順番を変えたい

順番はバリデーションとアソシエーションの記述位置を変える事で解消できる。記述の位置を変えるだけなので、特段問題が起こらないことが有難い。
これは、コードが上から読み込まれていることに起因すると考えられる。ちょっとしたことだけど、入力フォームの順に、エラーメッセージを出してあげたい。

3
3
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
3
3