バリデーションでエラーになった際に、エラーメッセージを各テキストフィールド等の下部に表示したい時があると思います。
今回はそんな時に便利な各attributeごとにエラーメッセージを抜き出す方法を紹介します。
手順
例えば User
の email
のエラーは以下のように抜き出します。
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ごとにエラーメッセージを返す時なんかにも便利そうだなと思いました。