#いいね機能実装中にmissing required keys: [:id]がでた。
上記のようにいいね機能(recommend)を実装しrecommendボタンを押すと中間テーブルにuser_idとmicropost_idが保存され、redirect_backされて、下記のようにrecommend件数が増えるはずが
上記のようにはならず下記のようなエラーが発生。
いいねしたあとのコード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に主キーを渡さなくてもいい方法調べるていくうちに下記の記事が見つかった。
今まで私はルートを下記のように記載していたが
resources :microposts, only: [:show, :create] do
resources :recommends, only: [:create, :destroy]
end
下記のように変更。変えたのは:recommendsの左記のresourcesからresourceへ単数形にした。
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(単数形)の方でいい気がするが複数形使う時ってどんな時なんだろう。