もふもふ技術部

IT技術系mofmofメディア

【Rails】validationのエラーメッセージをカラムごとに抜き出す

バリデーションでエラーになった際に、エラーメッセージを各テキストフィールド等の下部に表示したい時があると思います。

今回はそんな時に便利な各attributeごとにエラーメッセージを抜き出す方法を紹介します。

手順

例えば Useremail のエラーは以下のように抜き出します。

user = User.new
user.valid
user.errors.where(:email)

抜き出したものは配列になっているので、以下のようにすれば全てのエラーメッセージを日本語化した状態で取得できます。

user.errors.where(:email).map(&:full_message)

これを応用すると、エラーメッセージを各テキストフィールドの下部に表示できます。

<%= form_with model: @user, local: true do |f| %>
  <div>
    <label>メールアドレス</label>
    <%= f.text_field :email %>
    <% @user.errors.where(:email).each do |error| %>
      <p><%= error.full_message %></p>
    <% end %>
  </div>
  <div>
    <label>メールアドレス(確認)</label>
    <%= f.text_field :email_confirmation %>
    <% @user.errors.where(:email_confirmation).each do |error| %>
      <p><%= error.full_message %></p>
    <% end %>
  </div>
  <div>
    <%= f.submit "登録する" %>
  </div>
<% end %>

終わり

今回は、erbで表示することを前提にしましたが、APIでattributeごとにエラーメッセージを返す時なんかにも便利そうだなと思いました。