👻

バリデーションによるエラーメッセージを表示する

2023/07/20に公開

#バリデーションとは
ここまでのコーディングでは、投稿のときに空白かどうかのチェックはまったく行っていません。
このため、何も入力しなくても送信ボタンをクリックすれば投稿ができてしまいます。

空白のまま投稿ができてしまう状態は、あまり好ましくありません。
入力チェックの機能を追加して、画像、タイトル、本文が「必須」入力になるように設定しましょう。
このような入力チェックを、「バリデーション」と呼びます。

##バリデーションを設定する

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