【Rails】エラーメッセージ

はじめに

 エラーメッセージとはform_withなどで、入力内容が保存できない場合に、ユーザー保存できない理由を表示するものです。 このような表示見たことありますよね。

Image from Gyazo

今回は、このエラーメッセージを表示する方法について記していきます。

まずはバリデーションの定義
#Userモデル

  validates :first_name, presence: true, length: { maximum: 255 }
  validates :last_name, presence: true, length: { maximum: 255 }
  validates :email, uniqueness: true
  validates :email, presence: true
 

バリデーションを定義して、そのカラムに入るデータを制限しています。 今回は、存在性や長さの制限をいれました。フォームを通して、このバリデーションにひっかかるとエラーオブジェクトにエラー内容が格納されます。実はRailsのオブジェクトは、デフォルトでエラーオブジェクトを保持しています。つまり、バリデーションエラーが発生すると、このエラーオブジェクトに、ハッシュ形式で値が格納されていきます。その内容は、errorsというメソッドを使用することで確認できます。

# バリデーションエラー後

irb(main):001:0> user.errors
=> #<ActiveModel::Errors:0x00007ff8a2dbd128 @base=#
<User id: nil, last_name: "suzuki", 
first_name: nil,
email: nil, 
crypted_password: nil,
salt: nil,
created_at: nil, 
updated_at: nil>, 
@messages={:password=>["は3文字以上で入力してください"],
:password_confirmation=>["を入力してください"],
:email=>["を入力してください"],
:first_name=>["を入力してください"]}, 
@details={:password=>[{:error=>:too_short, :count=>3}], :password_confirmation=>[{:error=>:blank}], :email=>[{:error=>:blank}], :first_name=>[{:error=>:blank}]}>

このような形で、エラーメッセージがオブジェクトに格納されます。 これを表示させるために下記のコードが必要になります。

エラーメッセージの表示
<% if @user.errors.any? %>
  <div id="error_message" class="alert alert-danger">
    <ul>
      <% @user.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>

最初に、エラーがあるのかを確認して、

@user.errors.any?  #このオブジェクトにエラーはありますか?
-> false # エラーなし
-> true # エラーあり

その後、あるならそれを一つずつ表示させなさいというコードです。 これで上記に示した、エラーメッセージが表示できます。