LoginSignup
4
1

More than 3 years have passed since last update.

【なぜそれをやるかの解説付き】Railsの認証機能付きCRUDアプリで、他人に編集をさせなくする方法

Posted at

はじめに

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

コメントに書いた通りですが、このような感じです。

これを貼っつければ実装できる、というような記事が多かったため「なぜそうなるのか」をまとめてみました。
ご参考になれば幸いです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1