はじめに
ある投稿(postテーブル)に対して、いいね(favoriteテーブル)を削除する(destroyアクション)を実行すると、掲題のエラーが発生した。これについて、原因と対策を記す。
下記テーブルは作成済み。
userテーブル
postテーブル
favoriteテーブル
No | 項目 | 内容 |
---|---|---|
1 | OS | Mac |
2 | Ruby | 2.6.3 |
3 | rails | 6.0.4 |
原因: favoritesテーブルの主キー:idが渡せていない
rails routesでルーティングを見てみると、favoritesテーブルに主キーを渡さなければいけない。
ターミナル
post_favorite DELETE /posts/:post_id/favorites/:id(.:format) favorites#destroy
しかし、現状のコードでは渡せていなかったのが、エラーの原因のようだ。
対策: routesの設定を変える
三日間悩み、調べ、辿り着いたのがこの記事だった。
原因が主キーの渡しにあることもこの記事に気付かされたので、とても感謝している。。。
上記の記事と同様の対策を行なっていく。
そもそも主キーを渡す必要ないため、routesを変える方針で進める。
destroyアクションの時に、user_idとpost_idを検索してfavoritesテーブルからレコードを引っ張るので主キーがなくても情報が揃っているため。
favorites_controller.rb
def destroy
@post = Post.find(params[:post_id])
favorite = current_user.favorites.find_by(post_id: @post.id)
favorite.destroy
結果
resourcesをresourceに変える。
resources(変更前)
routes.rb
resources :posts do
resources :favorites, only: [:create, :destroy]
end
ターミナル
post_favorite DELETE /posts/:post_id/favorites/:id(.:format) favorites#destroy
resouce(変更後)
routes.rb
resources :posts do
resource :favorites, only: [:create, :destroy]
end
ターミナル
post_favorites DELETE /posts/:post_id/favorites(.:format) favorites#destroy
これで、エラーが消えた。
おわりに
いいね機能をAjaxを使って実装する際に起こったエラーである。
このコードをまとめたら、投稿したいと思う。