@LUC_rise (甚一朗 的場)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

rails タスク管理アプリにおける、他のユーザーの投稿へのアクセス制限

Q&A

Closed

解決したいこと

ここに解決したい内容を記載してください。

Ruby on Railsでタスク管理アプリを作成しました。
そこで発生した問題が、「ログインしているユーザーとは別のユーザーが作成したタスクを更新・削除できてしまう」というものです。
こちらを「そのタスクの詳細ページへの遷移、編集、更新、削除を行おうとした場合はトップページへリダイレクトされる」ようにしたいです。

発生している問題・エラー

タスクのコントローラーファイルに
before_action :correct_user, only: [:show,:edit]
に加えて「:update,:destroy」を追加し動作確認を行おうとしたが、どのようにしてほかのユーザーのタスクに対しての更新、削除のテストを行うのか分からない。
showとeditに関してはURLを直接入力しアクセスするとそのページへ移行しようとし正常にリダイレクトされるが、更新と削除の場合はどうすればいいのか分からない。

現状はとりあえず、showとeditのみ記述しております。

該当するソースコード

ソースコードを入力
class TasksController < ApplicationController
  
  before_action :require_user_logged_in
  before_action :correct_user, only: [:show,:edit]
  
  def index
    @tasks = current_user.tasks.all
  end

  def show
    @task = Task.find(params[:id])
  end

  def new
    @task = Task.new
  end

  def create
     @task = current_user.tasks.build(task_params)

    if @task.save
      flash[:success] = 'タスクが正常に作成されました'
      redirect_to @task
    else
      flash.now[:danger] = 'タスクが作成されませんでした'
      render :new
    end
  end

  def edit
    @task = Task.find(params[:id])
  end

  def update
    @task = Task.find(params[:id])

    if @task.update(task_params)
      flash[:success] = 'タスクは正常に更新されました'
      redirect_to @task
    else
      flash.now[:danger] = 'タスクは更新されませんでした'
      render :edit
    end
  end

  def destroy
    @task = Task.find(params[:id])
    @task.destroy
    
    flash[:success] = "タスクは正常に削除されました"
    redirect_to tasks_url
  end
  
   private

  # Strong Parameter
  def task_params
    params.require(:task).permit(:content, :status)
  end
  
  def correct_user
    @task = current_user.tasks.find_by(id: params[:id])
    unless @task
      redirect_to root_url
    end
  end
end
0 likes

1Answer

解決したいことが

「そのタスクの詳細ページへの遷移、編集、更新、削除を行おうとした場合はトップページへリダイレクトされる」ようにしたいです。

であるのに対し最終的に

どのようにしてほかのユーザーのタスクに対しての更新、削除のテストを行うのか分からない。

と記載されているので質問自体が
(1)「実装について」
(2)「テストについて」
のどちらなのか不明瞭になってしまっています。

def correct_userを実装してアクセス制御までは(恐らく)実装できたが、
更新と削除のテスト方法が分からない、という上記の(2)が質問だと推測して回答します。

Minitestか、RSpecか、はたまた別のテストツールを使用されるかは
分かりませんが方針だけ申し上げます。

テストしたい「update、destroy」のアクションに対しリクエストを発行し、
前後で
「タスクの内容が変わっていないこと」=> updateのテスト、
「タスクの数が変わっていないこと」=> destroyのテスト、
「変更できない場合はリダイレクトされること」=> 共通のテスト、
といったテストコードを記述すればケースとして充分かと思われます。

ブラウザを通して直接操作して~
という方法はあまり現実的ではございません。

0Like

Comments

  1. @LUC_rise

    Questioner

    回答ありがとうございます(^^)
    無事解決しました

Your answer might help someone💌