Windowsで始めるRuby on Rails入門【6.Validation】

どうも、tatsuです!

この記事はWindows環境でのRuby on Railsの入門記事シリーズの1つとなります。

前回記事はコチラ↓↓

Windowsで始めるRuby on Rails入門【5.CRUD処理の実装】

2018.11.10

今回は第六回目として、Validationを追加していきたいと思います。

Validation : 検証

Validationとは検証という意味で、データベースに登録する前に値をチェックすることができます。

例えば

「titleには10文字までしか入れてはいけない」

「titleは必須」

などを指定できます。

それではstudy_appで試していきましょう!

ModelにValidationを追加する

検証はModelに記述していきます。
models/memo.rbを開いて以下のように編集してください。

class Memo < ApplicationRecord
    # validates 対象属性名, 必須項目かどうか
    validates :title, presence:true
    # validates 対象属性名, 長さが10文字以内かどうか
    validates :title, length:{maximum: 10}

    validates :contents, presence:true
    validates :contents, length:{maximum: 20}
end
主なvalidatesオプション

検証内容 コード
入力必須 validates :対象属性名, presence: true
空であること validates :対象属性名, absence: true
文字数(上限) validates :対象属性名, length: {maximum: 10}
文字数(下限) validates :対象属性名, length: {minimum: 5}
整数であること validates :対象属性名, numericality: { only_integer: true }

その他にもたくさんあるので、興味のある方は公式ドキュメントを参考にしてください。

ここまでできたら、次はコントローラーの処理を変更します。

コントローラーで検証をする

「コントローラーで検証をする」と言いましたが、検証の処理自体はすでにrailsが用意してくれています。

今まで使っていた「save!」メソッドもその1つです。

それではmemos_contoller.rbを開いて以下のように修正してください。
※修正するcreateメソッドのみを説明します

class MemosController < ApplicationController
    # new.html.erbから値を送信した際に呼ばれるアクション
    def create
        # エラーをビューで受け取るために、memo→@memoとインスタンス変数にしている
        @memo = Memo.new(memo_params)

        # modelのvalidatesの結果によって分岐する
        # save!→saveメソッドに変更(save!はエラー時にException,saveはfalseを返す。今回はfalseを使いたい)
        if @memo.save 
            # 一覧画面へ遷移する
            redirect_to memos_url
        else
            # 新規作成画面に戻る
            render :new
        end
    end
end

 
こうすることで、検証をパスできればDBに登録して一覧画面へ戻り検証でエラーになったらDBに保存されず入力した内容がそのままで新規作成画面に戻ることができます。

このままでも検証自体はうまく動いているのですが、せっかくなのでエラーになったらビューにエラー情報をだしたいですよね?

次はビューを変更していきましょう!

エラー内容をビューに表示する

それではnew.html.erbファイルを以下のように修正してください。

<h1>メモ新規作成画面</h1>

<%= link_to "一覧へ戻る", memos_path %>

<%# form_withを使うと簡単に入力フォームを作ることができる %>
<%# form_with model: @モデル do |変数| %>
<%# local: true を指定すること(デフォルトremote:trueになっており、それだとエラーを拾えない) %>
<%= form_with model: @memo, local: true do |f| %>
    <p>
        <%= f.text_field :title %>
        <%# エラーが存在したらエラーメッセージを表示する %>
        <% if @memo.errors.any? %>
        <span class="error"><%= @memo.errors[:title][0] %></span>
        <% end %>
    </p>
    <p>
        <%= f.text_area :contents %>
        <%# エラーが存在したらエラーメッセージを表示する %>
        <% if @memo.errors.any? %>
        <span class="error"><%= @memo.errors[:contents][0] %></span>
        <% end %>
    </p>
    <p>
        <%= f.submit %>
    </p>
<% end %>

ついでにエラーメッセージの色を変えたいので、assets/stylesheets/memos.scssを開き、以下のように編集してください。

.error{
    color: red;
}

現状確認

それではサーバーを起動してstudy_appにブラウザからアクセスして確認しましょう!

以下のようにエラーメッセージが表示されていれば成功です。

まとめ

今回はValidation(検証)について説明しました。

不正なデータを入れないために必要なことなので、ぜひ深堀してみてください。

それでは!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です