👻
バリデーションによるエラーメッセージを表示する
#バリデーションとは
ここまでのコーディングでは、投稿のときに空白かどうかのチェックはまったく行っていません。
このため、何も入力しなくても送信ボタンをクリックすれば投稿ができてしまいます。
空白のまま投稿ができてしまう状態は、あまり好ましくありません。
入力チェックの機能を追加して、画像、タイトル、本文が「必須」入力になるように設定しましょう。
このような入力チェックを、「バリデーション」と呼びます。
##バリデーションを設定する
app/models/list.rb
class List < ApplicationRecord
has_one_attached :image
validates :title, presence: true
validates :body, presence: true
validates :image, presence: trueend
バリデーションを設定するには、モデルのファイルに設定内容を記述します。
返されたバリデーションの結果を、コントローラで検出できるようにしましょう。
if式を用いて、対象のカラムにデータが入力されていればsaveメソッドでtrueが返されます。
この場合、次に表示したいページにリダイレクトさせます。
対象のカラムにデータが入力されていなければ、saveメソッドでfalseが返されます。
falseならば、新規投稿ページを再表示するように設定します。
app/controllers/lists_controller.rb
def create
@list = List.new(list_params)
if @list.save
redirect_to list_path(@list.id)
else
render :new
end
end
###バリデーションでエラーメッセージを出力する方法
app/views/new.html.erb
<% if @list.errors.any? %>
<%= @list.errors.count %>件のエラーが発生しました
<ul>
<% @list.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
<% end %>
errorsは、モデルにバリデーションをかけたときに、発生したエラーの内容を確認できるメソッドです。
any? と組み合わせることで、エラーが発生しているかどうかを判定できます。
また、full_messagesと組み合わせることで、エラーの内容を出力できます。 エラー文は配列で保存されているため、eachを使います。
Discussion