ActiveRecord::RecordNotFound in BooksController#edit
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?로 하고 있습니다.
실제로 확인해 봅시다.
(내 게시 한 책의 상세 화면)
(다른 사람이 게시 한 책의 상세 화면)
괜찮아 보이네요!
엄청 간단한 오류이지만 조금씩 구현할 수있는 것은 재미 있습니다.
읽어 주셔서 감사합니다.
Reference
이 문제에 관하여(ActiveRecord::RecordNotFound in BooksController#edit), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/oteko7/items/aef567beb8a79db27d0c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)