

他人の投稿画面に遷移できない設定にしたいです。  
Rspecで引っかかってしまい解決できなくなっています。  
調べてみましたが解決方法が見つからなかったためアドバイス頂けると嬉しいです。  
よろしくお願いいたします。

[code]

    テスト結果
    
    1) 投稿のテスト 編集のテスト 他人の投稿の編集画面への遷移 遷移できない
         Failure/Error: expect(current_path).to eq('/books')
    
           expected: "/books"
                got: "/books/2/edit"
    
           (compared using ==)
    
[/code]

[code]

    booksコントローラ
    
    class BooksController < ApplicationController
      before_action :authenticate_user!
    
      def create
        @book = Book.new(book_params)
        @book.user_id = current_user.id
        @books = Book.all
        if
          @book.save
          flash[:notice] = "successfully"
          redirect_to book_url(@book)
        else
          render :index
        end
      end
    
      def index
        @book = Book.new
        @books = Book.all
      end
    
      def show
        @book = Book.find(params[:id])
      end
    
      def edit
        @book = Book.find(params[:id])
      end
    
      def update
        @book = Book.find(params[:id])
        if
          @book.update(book_params)
          flash[:notice] = "You have updated book successfully."
          redirect_to book_path(@book.id)
        else
          render :edit
        end
      end
    
      def destroy
        @book = Book.find(params[:id])
        @book.destroy
        redirect_to books_url
      end
    
      private
    
      def book_params
        params.require(:book).permit(:title, :body)
      end
    
      def correct_user
        @book = Book.find(params[:id])
        if currect_user != @book.user
           redirect_to user_path(currect_user)
        end
      end
    
    end
    
[/code]


CC BY-SA 4.0
2020-02-28T12:48:08.527
63438
2023-04-10T10:00:55.113
38007
question
ruby-on-rails rspec
他人の編集画面に遷移できないようにしたい。


> 他人の投稿画面に遷移できない設定にしたいです。

  * ログイン後のみ参照可能なページ
  * deviseなどを使用しており、`current_user`でログイン中のユーザー情報が参照できる
  * `user has_many books`

上記を前提としています。

[code]

    class BooksController < ApplicationController
      before_action :authenticate_user!
      before_action :set_book
    
      def show
        redirect_to books_url if @book.blank?
      end
    
      def set_book
        @book = current_user.books.find_by(id: params[:id])
      end
    end
    
[/code]

一般的なWebサービスの場合は、他人のページにアクセスすると`404`にする場合が多いかと思います。  
その場合は以下のようにするのが良いかもしれません。

[code]

    class BooksController < ApplicationController
      before_action :authenticate_user!
      before_action :set_book
    
      def show
      end
    
      def set_book
        @book = current_user.books.find(params[:id])
      end
    end
    
[/code]

もし以下が不明であれば調べてみてください。

  * find, find_byの違い
  * findでエラーになった場合の挙動


CC BY-SA 4.0
2020-03-03T04:19:17.073
63515
2020-03-03T04:19:17.073
22531
63438
answer