他人のユーザー編集画面、本の編集画面に遷移できないようにする

他人のユーザー編集画面、本の編集画面に遷移できないようにする

現状の作成したアプリケーションでは、他のユーザー編集画面、他のユーザーが投稿した本の編集画面に遷移することができてしまいます。

そのため、ログインユーザー以外が編集画面に遷移した際に、別の画面に遷移するように設定していきます。

他のユーザーの編集画面に遷移できないようにする

まず、ユーザー編集画面への遷移から設定を変更していきます。

他のユーザー編集画面に遷移しようとすると、自分のユーザー詳細画面に遷移するように設定します。

usersコントローラに記述していきます。

app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :is_matching_login_user, only: [:edit, :update]
:
  private
:
  def is_matching_login_user
    user = User.find(params[:id])
    unless user.id == current_user.id
      redirect_to user_path(current_user)
    end
  end

is_matching_login_userというメソッドを定義し、画面のuser_IDを取得し、ログインしているユーザーと同一のユーザーであるか確認している。

異なっていた場合、redirect_toでログインユーザーの詳細画面に遷移するようにしている。

また、定義したメソッドは、before_actionでeditアクションとupdateアクションが行われる前に、実行されるように記述した。

※ before_actionとは、コントローラーで各アクションを実行する前に実行したい処理を指定することができるメソッドです。

指定したい処理は、今回のようにメソッドとしてまとめることで、使用することができます。

他のユーザーが投稿した本の編集画面に遷移できないようにする

次に、他のユーザーが投稿した本の編集画面に遷移できないように設定していく。

booksコントーラーに記述していく。

app/controllers/books_controller.rb

class BooksController < ApplicationController
  before_action :ensure_correct_user, only: [:edit, :update]
:
private
:
  def ensure_correct_user
    book = Book.find(params[:id])
    unless book.user_id == current_user.id
      redirect_to books_path
    end
  end
end

ensure_correct_userというメソッドを定義し、URLのIDを取得し、そのIDを持つbookの投稿ユーザーとログインユーザーが同一人物であるか、確認している。

異なっていた場合、本の一覧表示画面に遷移するようになっている。

以上。

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