質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

208閲覧

ParameterMissing を解決できない。

yutann

総合スコア23

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/07/15 06:32

あるユーザーが特定の記事をお気に入り登録して、お気に入り記事のみを一覧表示できる機能を実装しようとしているのですが、お気に入り登録を解除する機能でParameterMissingエラーが起きました。

データベース上では、id=11のfavoriteのなかに今のユーザーID(5)とお気に入りを解除したい記事のID(5)を格納していて、このfavoriteを消去することでお気に入りを解除します。

以下が、favoriteクラスのコントローラのコードです。

ruby

1class FavoritesController < ApplicationController 2 def destroy 3 @favorite = Favorite.find(favorite_params) 4 @favorite.destroy 5 redirect_to favorite_path(current_user) 6 end 7 8 private 9 10 def favorite_params 11 params.require(:favorite).permit(:user_id, :article_id) 12 end 13 14end

user, favorite, articleの関連付けは済ませてあります。

この時、以下のエラーが発生しました。
イメージ説明

不足してるコードがあったらすみません。パラメータについての知識が不足しているのかもしれませんが、解決の仕方がわかりません。よろしくお願いします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

テーブル間の関係は推測で書いてみましたが、こんな感じになるのではないでしょうか?

def destroy article = Article.find(params[:article_id]) favorite = article.favorites.find_by(article_id: article.id) favorite.destroy if favorite end

投稿2019/07/15 07:03

bamboo-nova

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yutann

2019/07/15 07:17

情報不足で失礼しました。各テーブルにはカラムが以下のようにあります。 favorite→id, user_id, article_id article→id user→id 教えていただいたコードでは、ActiveRecord::RecordNotFound in FavoritesController#destroyというタイトルでエラーが発生しました。 article = Article.find(params[:article_id])についてCouldn't find Article without an IDと指摘されました。どうしたらよいでしょうか?
yutann

2019/07/15 07:21

あ、articleにはarticle_idカラムがないから、params[:id]にすればよいということでしょうか。実際に実行してみるとエラーが出なくなり、無事実行できました!
bamboo-nova

2019/07/15 07:27

あ、userからarticleへは別途で1対多の関係はなかったんですね汗 良かったです。
yutann

2019/07/16 03:28

遅れての再コメントで申し訳ありません。 回答にあるdestroyアクションの中の2行目で何をしているのか教えていただきたいです。 必要であれば再度質問を作成します。
bamboo-nova

2019/07/16 03:41

これは、もしもフォーム画面で例えばですが <%= form_for(@article.favorites.find_by(article_id: @article.id), html: { method: :delete }) do |f| %> <%= hidden_field_tag :article_id, article.id %> などとして、article_idという属性にarticleのidを入れていた場合にparams[:article_id]として取得されるので、 favorite = article.favorites.find_by(article_id: article.id) として、params[article_id]がarticleのidであることを示す必要があったためです。 今回は、そのままparams[:id]で参照させているみたいなので問題ないかなと思います。
Mugheart

2019/07/16 04:42

解決済みですが、コメント失礼しますね。 favorite = article.favorites.find_by(article_id: article.id) この部分ですが僕もちょっと疑問で、 あんまり意味のないことをしてるんじゃないかなぁ...と もしかして favorite = article.favorites.find_by(user_id: current_user.id) がしたかった...とかではないですか?というのも article.favorites の時点で article_id == article.id のものしかないはずなんですよね。 なのでここで行うべきことは user_idでの絞り込みじゃないかなぁと思います。
bamboo-nova

2019/07/16 05:46

あっ…本当ですね汗 すみません、補足ありがとうございます…!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問