バリデーションと権限の実装、エラーメッセージの表示

バリデーションと権限の実装、エラーメッセージの表示

バリデーションとは

バリデーションとは、データベースにデータを保存する前に保存する内容を検証する機能です。

例えば「名前やメールアドレス、パスワード」のデータ保存の時に、入力必須項目に何も入力しなかった場合、投稿ができないようにするということや、

3文字以上の文字を入れるという条件を検証し、検証に通らないとデータを保存できないようにするというものです。

権限とは

権限とは、ユーザーがログインしていない状態で、URLにログイン後の画面を表示させようとした場合、

トップページに遷移するようにするといった制限をつけることをいいます。

権限の実装

まずは権限を実装していきます。

今回は、ログインしていない状態で、トップページとアバウトページ以外に遷移した場合に、トップページに遷移するという権限を実装していきます。

applicatinoコントローラに下記の記述を追加します。

app/controllers/application_controller.rb

before_action :authenticate_user!, except: [:top, :about]

上記の記述でログイン前にトップページとアバウトページに遷移した際に、トップページに遷移するようになる。

バリデーションの実装

今回実装するバリデーションは下記となる。

Userモデル

  • nameカラム → 一意性を持たせること、2~20文字の文字数制限をすること

  • introductionカラム → 最大50文字までに文字制限すること

Bookモデル

  • titleカラム → 空欄でないこと

  • bodyカラム → 空欄でないこと、最大200文字までに文字制限すること

各モデルに記述を追加していく。

app/models/user.rb

  validates :name, uniqueness: true, length: { in: 2..20 }

  validates :introduction, length: { maximum: 50 }

app/models/book.rb

  validates :title, presence: true
  validates :body, presence: true, length: { maximum: 200 }

一意性を持たせる記述はデータベース側にも必要であるため、下記を実行する。

$ rails g migration add_column_to_users

作成したマイグレーションファイルに記述を追加する。

def change
  add_index :users, :name, unique: true
end

データベースにマイグレートする。

$ rails db:migrate

エラーメッセージの表示

設定したバリデーションによるエラーメッセージを表示していく。

まず、views/loyoutsフォルダ内に_error.html.erbという部分テンプレートファイルを作成し、記述していく。

app/views/layouts/_error.html.erb

<div>
  <% if obj.errors.any? %>
    <h3><%= pluralize(obj.errors.count, "error") %> prohibited this obj from being saved:</h3>
    <ul>
      <% obj.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  <% end %>
</div>

このエラーメッセージを表示したい下記の箇所に追加記述していく。

  • ユーザー情報を編集機能

  • 本の投稿機能

  • 本の情報編集機能

ユーザー情報編集機能

まずは、usersコントローラに記述していく。

app/controllers/users_controller.rb(変更箇所のみ抜粋)

  def update
    @user = User.find(params[:id])
    if @user.update(user_params)
      redirect_to user_path(@user)
    else
      render :edit
    end
  end

if文で情報更新できない場合、アクションは行わず、editに戻すという記述を行った。

ビューでrenderで戻された際に、エラーを表示できるように記述していく。

app/views/users/edit.html.erb(追記部分を抜粋)

<h2>User info</h2>
<%= render 'layouts/error', obj: @user %>  #追加
本の投稿機能

まずは、booksコントローラに記述していく。

app/controllers/books_controller.rb(変更箇所のみ抜粋)

  def create
    @book = Book.new(book_params)
    @book.user_id = current_user.id
    if @book.save
      redirect_to book_path(@book)
    else
      @user = current_user
      @books = Book.all
      render :index
    end
  end

if文で情報更新できない場合、アクションは行わず、indexに戻すという記述を行った。アクションを実行しないため、renderの前に@userと@booksを定義する記述を行う。

ビューでrenderで戻された際に、エラーを表示できるように記述していく。

app/views/books/index.html.erb(追記部分を抜粋)

<div class="container px-5 px-sm-0">
  <%= render 'layouts/error', obj: @book %>  #追記
本の編集機能

まずは、booksコントローラに記述していく。

app/controllers/books_controller.rb(変更箇所のみ抜粋)

  def update
    @book = Book.find(params[:id])
    if @book.update(book_params)
      redirect_to book_path(@book.id)
    else
      render :edit
    end
  end

if文で情報更新できない場合、アクションは行わず、editに戻すという記述を行った。

ビューでrenderで戻された際に、エラーを表示できるように記述していく。

app/views/books/edit.html.erb(追記部分を抜粋)

<h1>Editing Book</h1>
<%= render 'layouts/error', obj: @book %>  #追記

以上。

アプリケーションの作成 参考URL  作成するアプリケーションについて - takifugu’s blog