ActiveRecord::RecordNotFound in BooksController#edit

5274 단어 루비Railserror

ActiveRecord::RecordNotFound in BooksController#edit



Ruby on Rails 초보자입니다.

Ruby on Rails로 로그인 기능이 있는 책의 감상을 등록할 수 있는 어플리케이션을 작성하고 있습니다.

로그인한 유저 이외의 유저(타인의 유저)가 투고한 책의 내용에 편집과 삭제를 할 수 없도록 액세스 제한을 가하는 구현을 하고 있었습니다만, 그 도중에 이러한 에러가 나왔습니다 .

오류 내용을 살펴보면 다음과 같은 설명이있었습니다.

Couldn't find User with 'id'=15

분명히 user 모델의 id에 15가 없다고 하는 에러인 것 같습니다.
이 id는, 본래는 Book 모델의 id일 것이다~라고 생각하면서 컨트롤러의 해당 소스 코드를 보면,

app/controllers/books_controller.rb
before_action :correct_user,   only: [:edit, :update, :destroy]

#(省略)

private
def correct_user
    @book = Book.find(params[:id])
    @user = User.find(params[:id])
    redirect_to(books_path) unless current_user?(@user)
end

def current_user?(user)
   user == current_user 
end

def book_params
   params.require(:book).permit(:title, :body, :user_id)
end

이런 설명을 했어요
Book 모델의 컨트롤러에서 정의도하지 않은 user의 params를 취하려고하는 것은 이상합니다.

그래서 다음과 같이 수정했습니다.

app/controllers/books_controller.rb
before_action :correct_user,   only: [:edit, :update, :destroy]

#(省略)

private
    def correct_user 
      @book = Book.find(params[:id])
      redirect_to(books_path) unless current_user?(@book.user)
    end

    def current_user?(user)
      user == current_user
    end


    def book_params
        params.require(:book).permit(:title, :body, :user_id)
    end

(로그인 기능에는 devise를 사용하고 있습니다.)

이것으로 괜찮습니다.

correct_user는 사용자가 자신이었을 때 아무 작업도 수행하지 않지만 다른 사람이면 redirect_to에서 게시물 목록으로 리디렉션되도록합니다.
사용자가 자신인지 타인인지 판단은 currect_user?로 하고 있습니다.

실제로 확인해 봅시다.

(내 게시 한 책의 상세 화면)


(다른 사람이 게시 한 책의 상세 화면)


괜찮아 보이네요!
엄청 간단한 오류이지만 조금씩 구현할 수있는 것은 재미 있습니다.

읽어 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기