Railsのバリデーションでエラーメッセージが重複するのを避けてみる
Railsのバリデーション機構を使っていると、エラーメッセージの表示がうまくない。
たとえばメールアドレスの入力バリデーションで、必須チェックとフォーマットチェックを以下のように入れたとする。
validates :email, presence: true, format: {with: VALID_EMAIL_REGEX}
エラー出力のerbはこんな感じ。
<% model.errors.full_messages.each do |msg| %> <li>* <%= msg %></li> <% end %>
で、この状態でメールアドレスの入力を空にすると、必須チェックにもフォーマットチェックにもひっかかるのでエラーメッセージも2つでてくる。
* Email can't be blank
* Email is invalid
これを解消するためにこんな感じにしてみた。
<% model.errors.each do |attr, msg| %> <% if model.errors[attr].first == msg %> <li>* <%= "#{attr} #{msg}" %></li> <% end %> <% end %>
試してみる。
* Email can't be blank
エラーがひとつになった!
追記)
だめだ。この方法だとpassword_digestみたいなやつも出てきちゃう。エラーメッセージをどこでフルイにかけてるのか追えず・・・。Errors::full_messageしかないと思ったんだけど・・・。
追記)
項目ごとにエラーメッセージを1つにするには、いらんバリデーションをかけない、というアプローチがあるよう。でもこれダルいなぁ。。
http://stackoverflow.com/questions/15461028/rails-3-empty-field-on-submit-displays-multiple-error-messages