はじめに
yukiと申します。DMMWEBCAMP にお世話になって、今は WEB エンジニアとして勤務しつつ、自分で仲間を集めてサービス開発したり、プログラミングの家庭教師したり毎日エンジニアライフをエンジョイしています。
未経験から目指している方向けのサポートやエラー質問なども引き受けておりますので、気になった方は DM へお願いします。
今回は認証機能のある CRUD アプリでよくある、自分の投稿の編集を他人にさせない機能について解説します。
前提
- crud アプリと言って通じる方
- Rails の簡単なアプリを作成中の方
- Rails を触るのが初めてもしくは期間が短めで、現在学習中の方
- devise などで認証の設定、crud 機能の実装が終わっている
最終目標
投稿を編集する URL をベタ打ちで入力したとき、投稿者と編集者が異なる場合、一覧ページなどにリダイレクトさせる機能の実装
# post/1/editなどのURLを入力する
# 投稿者と編集者が違った場合、/postsにリダイレクトさせる
①edit をしようとする際に、必ず通過するメソッドを作る
「他人の投稿を編集しようとしたとき、リダイレクトさせる」と言うのは、つまり編集という行為をしようとした際に、その機能を必ず呼び出すということです。まずは、edit や update をしようとしたときに、ある処理を読み込める状況を作りましょう。
posts_controller.rb
class PostssController < ApplicationController
before_action :correct_user, only: [:edit, :update]
# 中略
def edit
@book = Post.find(params[:id])
end
end
before_action
についてはこちらの記事でわかりやすく解説されています。つまり、指定したアクションの前に必ず指定したメソッドを実行するというわけです。
今回は、edit と update の前に…correct_user
…つまり、正しいユーザーであるかチェックするメソッドを呼び出しています。
② 呼び出されるメソッドを定義する
posts_controller.rb
# 中略
private
def correct_user
@post = Post.find(params[:id]) # idをもとにPost(投稿)を特定
@user = @post.user # 特定されたPostに紐づくUserを特定し、@userに入れる
if current_user != @user # 現在ログインしているユーザー(編集者)と@user(投稿者)が異なったら
redirect_to posts_path # 一覧ページにリダイレクトさせる
end
end
コメントに書いた通りですが、このような感じです。
これを貼っつければ実装できる、というような記事が多かったため「なぜそうなるのか」をまとめてみました。
ご参考になれば幸いです。