【Rails】エラーメッセージ
はじめに
エラーメッセージとはform_withなどで、入力内容が保存できない場合に、ユーザー保存できない理由を表示するものです。 このような表示見たことありますよね。
今回は、このエラーメッセージを表示する方法について記していきます。
まずはバリデーションの定義
#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 # エラーあり
その後、あるならそれを一つずつ表示させなさいというコードです。 これで上記に示した、エラーメッセージが表示できます。