フォーム入力時にバリデーションエラーが発生していることを視覚的にわかりやすくするためにエラーメッセージを個別表示させていきます。
まず最初にエラーメッセージ用のテンプレートを作成します。
Sayo-MacBook-Pro:emoji_diary SAYO$ touch app/views/shared/_error_messages.html.erb
作成したエラーメッセージのテンプレートに追記していきます。
<% if object.errors.any? %>
<div class="alert alert-warning">
<ul>
<% object.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
errors.full_messages
は全てのエラーメッセージを配列で取得します。
エラーメッセージを表示したフォームの上に、このrender
文を挿入します。
<%= render 'shared/error_messages', object: f.object %>
日記投稿のフォーム部分は内容が同じなのでテンプレートファイルとして作成していこうと思います。まず最初に部分テンプレートのファイルを作成しました。
Sayo-MacBook-Pro:emoji_diary SAYO$ touch app/views/diaries/_form.html.erb
作成したファイルにフォーム部分を入力していきます。この部分テンプレートでは色々なファイルで使用するので、インスタンス変数は使わないようにします。※edit.html.erb
ファイルでは、<%= form_with model: @diary, local: true do |f| %>
のように、form_with
でインスタンス変数を使っていました。
<%= form_with model: diary, local: true do |f| %>
<div class="form-group">
<%= f.label :start_time %></br>
<%= f.date_select :start_time, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :feeling %>
<%= f.text_field :feeling, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :body %>
<%= f.text_field :body, class: 'form-control' %>
</div>
<div class="submit">
<%= f.submit class: "btn btn-primary" %>
</div>
<% end %>
(diaries/edit.html.erb、new.html.erb)
<div class="container">
<div class="row">
<div class="col-lg-8 offset-lg-2">
<%= render 'form', { diary: @diary } %>
</div>
</div>
</div>
ユーザー新規登録のページにエラーメッセージを挿入します。