##ActiveRecord::RecordNotFound in BooksController#edit
Ruby on Rails超初心者です。
Ruby on Railsでログイン機能付きの本の感想を登録できるアプリケーションを作成しています。
ログインしているユーザー以外のユーザー(他人のユーザー)が投稿した本の内容に編集と削除ができないようにアクセス制限をかける実装をしていましたが、その途中でこのようなエラーが出ました。
エラー内容を見ていくと、以下の記述がありました。
Couldn't find User with 'id'=15
どうやら、userモデルのidに15はないよーというエラーみたいです。
このidは、本来はBookモデルのidであるはずだな~と思いながらコントローラーの該当のソースコードを見てみると、、
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をとってこようとするのはおかしいですね笑
そこで、以下のように修正しました。
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?で行っています。
実際に確認してみましょう。
大丈夫そうですね!
めちゃくちゃ単純なエラーですが、ちょっとずつ実装できるのは楽しいです笑
読んでくださってありがとうございました。