読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

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