0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ActiveRecord::RecordNotFound in BooksController#edit

Posted at

##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?で行っています。

実際に確認してみましょう。

(自分の投稿した本の詳細画面)
スクリーンショット (226).png

(他人の投稿した本の詳細画面)
スクリーンショット (227).png

大丈夫そうですね!
めちゃくちゃ単純なエラーですが、ちょっとずつ実装できるのは楽しいです笑

読んでくださってありがとうございました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?