3
5

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.

いいね機能実装中にルートエラーmissing required keys: [:id]で時間が溶けた。

Last updated at Posted at 2021-03-19

#いいね機能実装中にmissing required keys: [:id]がでた。

スクリーンショット 2021-03-19 19.10.49.png

上記のようにいいね機能(recommend)を実装しrecommendボタンを押すと中間テーブルにuser_idとmicropost_idが保存され、redirect_backされて、下記のようにrecommend件数が増えるはずが
スクリーンショット 2021-03-19 21.16.22.png

上記のようにはならず下記のようなエラーが発生。

スクリーンショット 2021-03-19 17.26.44.png

いいねしたあとのコードdestroyときにいいねの中間テーブルの主キーが見つからないと吐いているらしいとはわかったが、どうしたら主キーを入れられるかがわからず時間が溶けた。
#問題は中間テーブルに主キーがないこと
エラー発生時のroutesは以下。

 micropost_recommend DELETE /microposts/:micropost_id/recommends/:id(.:format) recommends#destroy

よく見るとDELETEのパスのurlにrecommendsのidが入っている。しかし調べても主キーの渡し方がわからん。
色々調べると、中間テーブルからdeleteする際に、user_idとmicropost_idでfind_byしたものなので、urlに中間テーブルの主キー渡さなくてもよくね?となった。

#route.rbファイルのresouceとresoucesの違い
さてこのルートのurlに主キーを渡さなくてもいい方法調べるていくうちに下記の記事が見つかった。

今まで私はルートを下記のように記載していたが

routes.rb
 resources :microposts, only: [:show, :create] do
    resources :recommends, only: [:create, :destroy]
  end

下記のように変更。変えたのは:recommendsの左記のresourcesからresourceへ単数形にした。

routes.rb
 resources :microposts, only: [:show, :create] do
    resource :recommends, only: [:create, :destroy]
  end

するとルートが

 micropost_recommend DELETE /microposts/:micropost_id/recommends/:id(.:format) recommends#destroy

上記から下記へ変わった。

micropost_recommends DELETE /microposts/:micropost_id/recommends(.:format) recommends#destroy

そうdeleteのルートurlにrecommendsの主キーである:idが消えたのである。

これでバッチリ動いたし、別のユーザーがいいねを取り消しても他のユーザーのいいねが取り消されたりもしなかった。

中間テーブルだとresouce(単数形)の方でいい気がするが複数形使う時ってどんな時なんだろう。

3
5
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
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?