バリデーションと権限の実装、エラーメッセージの表示
バリデーションと権限の実装、エラーメッセージの表示
バリデーションとは
バリデーションとは、データベースにデータを保存する前に保存する内容を検証する機能です。
例えば「名前やメールアドレス、パスワード」のデータ保存の時に、入力必須項目に何も入力しなかった場合、投稿ができないようにするということや、
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