Rails バリデーション

2023/04/04に公開2

バリデーションとは

画像、タイトル、本文が「必須」入力になるように設定する、入力チェックのこと!

バリデーションを設定

バリデーションを設定するには、モデルのファイルに設定内容を記述!

class List < ApplicationRecord
  has_one_attached :image
  
  validates :title, presence: true
  validates :body, presence: true
  validates :image, presence: trueend

validatesで対象とする項目を指定し、入力されたデータのpresence(存在)をチェックする!
trueと記述すると、データが存在しなければならないという設定になる!

返されたバリデーションの結果を、コントローラで検出できるようにする!

if式を用いて、対象のカラムにデータが入力されていればsaveメソッドでtrueが返される。
この場合、次に表示したいページにリダイレクトさせる。

対象のカラムにデータが入力されていなければ、saveメソッドでfalseが返されます。
falseならば、新規投稿ページを再表示するように設定。

  def create
    @list = List.new(list_params)
    if @list.save
      redirect_to list_path(@list.id)
    else
      render :new
    end  
   end

ちなみにデータベースのデータのリセット方法

 rails db:migrate:reset

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

表示させたいビューファイルに記述

<% 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を使う。

送信ボタンをクリックして確認!

私が経験したエラーのメモ_φ(・_・

バリデーションチェックは完了しているが、
なぜかエラーにならずメッセージが表示されない、、

間違っていたコード

def create
@book = Book.new(book_params)
	if @book.save
		flash[:notice] = "Book was successfully created."
		redirect_to book_path(@book.id)
	else
		@books = Book.all
		@book = Book.new
		render :index
	end
end

renderでindexページに飛ぶ際に
@book = Book.newがcreateアクションの中にすでにあるのにも関わらず、

再定義してしまっており、
空のインスタンス変数がまた作られてしまっていた!!
なのでエラーが起きていなかった_φ(・_・

正しいコード

def create
	@book = Book.new(book_params)
	if @book.save
		flash[:notice] = "Book was successfully created."
		redirect_to book_path(@book.id)
	else
		@books = Book.all
		render :index
	end
end

redirect_toとrenderの処理の違い

・redirect_toを用いてHTTPリクエストを行う
・renderを用いて別のアクションに対応するビューを表示する

redirect_to

  1. redirect_toがルーティングにURLを送る
  2. ルーティングに送られてきたURLとHTTPメソッドを照らし合わせて、どのコントローラのどのアクションを実行するかを決める
  3. アクションを実行する
  4. ビューを表示する

「ブラウザにURLを打ち込む代わりにredirect_toで画面が遷移できる」と考える。

render

  1. renderで定義したビューファイルを表示する。

renderは直接ビューファイルを表示させています。 そのため画面の遷移はなく、表示されているHTMLが入れ替わるのみ。

違いと注意点

  • render
    アクションを新たに実行しない
  • redirect_to
    アクションを新たに実行する

renderを扱う上で気をつけるべきことは
renderするビューに必要なインスタンス変数は、あらかじめ用意しなくてはならないということ

基本的には、エラーメッセージを扱う際にはrender、それ以外はredirect_toを使うと覚えておく!!

まとめ

  • redirect_toはアクションを実行する
  • renderはアクションを実行しない
  • ビューは自身が呼び出されたアクション内からインスタンス変数を参照する
  • renderを使う際、ビューの表示に必要なインスタンス変数を用意しなくてはならない
  • renderの性質を利用してエラーメッセージを表示することができる

今日は始めてデイリースクラムの日で、同じ受講生の方と話せて嬉しかった!
し、さらにやる気が湧いてきた!

メンターさんにも色々質問して、スピードをあげて取り組めた😌
課題2も提出できて、Railsが少しずつわかってきて楽しくなってきた〜
明日から課題3に入る!
ここで結構時間使いそうだから早めに入れてよかった、、!

明日は友達が誘ってくれて新宿校舎に行って初めて勉強してみる!🙌🏻
頑張ろう〜🏋🏻

Discussion

AirichanAirichan

すごい!!ちゃんと問題の原因になった場所とそのメソッドについてまとめられてる!!!!!

sayasaya

メンターさんのおかげでちゃんと理解できてまとめられた!!もっと活用せねば🥺