#はじめに
投稿するボタンをクリックした後間違えがあった場合、エラーメッセージが表示されればユーザーは何を間違えたかが一目で分かると思います。
今回はそのエラーメッセージを表示させる記述をしたいと思います。
#やる事
-
モデルにバリデーションをかける
-
エラーメッセージを受け取るファイルを作成する
-
エラーメッセージを表示させるようにビューファイルに記述する
大まかにこの3点です。
#モデルにバリデーションをかける
フリマアプリを作成中だとして、フリマに出品する際に商品名や画像がないと何の商品かわからないですよね。
なので空欄では出品できないようにバリデーションを定義します。
class Item < ApplicationRecord
validates :name, presence: true
validates :image, presence: true
end
with_options presence: true do
でまとめる事ができますが省略します。
これで空の場合は投稿できないようにしました。
#エラーメッセージを受け取るファイルを作成する
ファイルを作成する場所は今回はviews>shared>_error_messages,html.erb
に作成します。
<% if model.errors.any? %>
<div class="error-alert">
<ul>
<% model.errors.full_messages.each do |message| %>
<li class='error-message'><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
この記述の中身を解説します。
<% if model.errors.any? %>
<% end %>
any?メソッド
で1つでもエラーがあった場合、条件分岐で下の内容が読み込まれます。
今回はitemモデルの中にエラーはありますかとなります。
ちなみにerrors
は今起きているエラーをエラーメッセージとして受け取ることができます。
<ul>
<% model.errors.full_messages.each do |message| %>
<li class='error-message'><%= message %></li>
<% end %>
</ul>
model.errors.full_messages.each do |message|
の記述で全てのエラーメッセージをmessage
に格納します。
errors.full_messages
とは詳細なエラーメッセージを確認することができます。
今回はitemモデルのエラーメッセージです。
例としてimageが空だとどんなエラーメッセージが出るのか検証します。
valid?メソッド
を使用します。
item.image = nil #写真が空ですよ
item.valid? #検証
=> false
item.errors.full_messages
=>["Image can't be blank"] #エラーメッセージ
このように出てくる詳細なエラーメッセージをmessage
に格納します。
そして<ul><li>タグ
で箇条書きにして表紙させます。
#エラーメッセージを表示させるようにビューファイルに記述する
エラーメッセージのファイルをビューファイルに貼り付けます。
<%= form_with model: @item, local: true do |f| %>
<%= render 'shared/error_messages', model: f.object %>
<% end %>
#参考