3
0

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 1 year has passed since last update.

【Rails】missing required keys: [:id]の原因と対策

Posted at

はじめに

ある投稿(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

結果

resourcesresourceに変える。
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を使って実装する際に起こったエラーである。
このコードをまとめたら、投稿したいと思う。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?