基礎編10

2021.3.17

 

フォーム入力時エラー情報を個別表示

 

参照

Rails エラーメッセージの表示 - Qiita

 

・エラーメッセージを直接生成するビューヘルパーはRailsに含まれていないので、表示が必要な場合はパーシャル化して、汎用的に使用できるようにしておく。

Railsのオブジェクトは、デフォルトでエラーオブジェクトを保持している。

そして、バリテーションが発生すると、このエラーオブジェクトにハッシュ形式で値が保持される。

・オブジェクトに設定されているエラーオブジェクトは、errorsというメソッドを使用することで確認できる。

・createアクションではインスタンス変数(ここでは@user)を使用していること。

→create失敗時にnewテンプレートをrenderしているので、その時にエラーメッセージをフォームに表示させるには、インスタンス変数にしておく必要がある。

 

 

<エラーメッセージ表示のパーシャルファイル作成>

Controllerで扱ったリソースのインスタンス変数をobjectに代入して呼び出す想定。

objectのローカル変数がerrorsを持つ場合、エラーメッセージを表示する。

(app/views/shared/_error_messages.html.erb)

<% if object.errors.any? %>
<div id="error_messages" class="alert alert-danger">
<ul class = "mb-0">
<% object.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>

 

<エラーメッセージを表示する :ユーザーと掲示板のフォーム>

ここで、↓このように記述しても、新規作成の処理は成功する。

<%= form_with model: User.new

だが...

失敗時にエラーメッセージを表示することができない、編集画面でこのテンプレートを使い回せないという点から、インスタンス変数(ここでは@user)を設定する。

・createアクションではインスタンス変数(ここでは@user)を使用していること。

→create失敗時にnewテンプレートをrenderしているので、その時にエラーメッセージをフォームに表示させるには、インスタンス変数にしておく必要がある。

 

@userのオブジェクトが未完成か作成済かによって、表示されるタグのHTMLを出し分けることができる。(createかupdateか判断してくれる)

 

(app/views/users/new.html.erb)

<div class="container">
<div class="row">
<div class="col-md-10 offset-md-1 col-lg-8 offset-lg-2">
<h1><%= t '.title' %></h1>
<%= form_with model: @user, local: true do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="form-group">
<%= f.label :last_name %>
<%= f.text_field :last_name, class: "form-control" %>
</div>

(app/views/boards/_form.html.erb)

<%= form_with model: board, local: true do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="form-group">
<%= f.label :title %>
<%= f.text_field :title, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :body %>
<%= f.text_area :body, class:'form-control', rows: 10 %>
</div>

<%= f.submit class: 'btn btn-primary' %>
<% end %>