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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

1236閲覧

お気に入り機能で詰まっています。。

manami0419

総合スコア10

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/30 10:43

前提・実現したいこと

合コンアプリを作っていまして、その中で合コン情報の投稿に対するお気に入り機能を実装しています。
お気に入りはできるのですが、お気に入り解除ができません。
ルーティングエラーになってしまいます。
原因がわからず、困っています。。( ; ; )

発生している問題・エラーメッセージ

Routing Error No route matches [DELETE] "/user_infos/13/favorites" Rails.root: /Users/yuta/projects/sugu Application Trace | Framework Trace | Full Trace Routes Routes match in priority from top to bottom

該当のソースコード

↓ルーティングです。

ruby

1Rails.application.routes.draw do 2 ・ 3 ・ 4 ・ 5 resources :rooms 6 resources :user_infos do 7 collection do 8 get 'pre_page' 9 get 'false' 10 end 11 resources :favorites, only: [:index, :create, :destroy] 12 end 13end

↓お気に入りボタンのビューです。

ruby

1 ・ 2 ・ 3 ・ 4<ul class="groups"> 5 <% @user_infos.each do |user_info| %> 6 <li class="list"> 7 <div class='user_infos'> 8 <div class="user_img"> 9 <!-- ネットのフォローボタン --> 10 <%= image_tag user_info.image.variant(resize:'400x400'), class: "user_img" if user_info.image.attached? %> 11 <% if user_signed_in? && user_info.user_id != current_user.id %> 12 <% if user_info.favorited_by?(current_user) %> 13 <p class="followed_btn"><%=link_to "お気に入り済", user_info_favorites_path(user_info.id), class: "white", method: :delete %></p> 14 <% else %> 15 <p class="follow_btn"><%=link_to "お気に入り", user_info_favorites_path(user_info.id), class: "white", method: :post %></p> 16 <% end %> 17 <% end %> 18 <!-- ネットのフォローボタン --> 19 ・ 20 ・ 21 ・

↓コントローラーです。

ruby

1class UserInfosController < ApplicationController 2 3 before_action :search_user_info, only: [:index, :search] 4 5 def index 6 @promotion_male = UserInfo.joins(:user).where(users: { gender: "男"}).count 7 @promotion_female = UserInfo.joins(:user).where(users: { gender: "女"}).count 8 unless user_signed_in? 9 @user_infos = UserInfo.all.order(id: "DESC") 10 set_user_info_column 11 return 12 end 13 if current_user.gender == "女" 14 @user_infos = UserInfo.joins(:user).where(users: { gender: "男"}).order(id: "DESC") 15 set_user_info_column 16 elsif current_user.gender == "男" 17 @user_infos = UserInfo.joins(:user).where(users: { gender: "女"}).order(id: "DESC") 18 set_user_info_column 19 end 20 end 21 ・ 22 ・ 23 ・

↓ターミナルのルーティングです。

user_info_favorites GET /user_infos/:user_info_id/favorites(.:format) favorites#index POST /user_infos/:user_info_id/favorites(.:format) favorites#create user_info_favorite DELETE /user_infos/:user_info_id/favorites/:id(.:format) favorites#destroy

試したこと

favorite#destroyのアクションのパスなんですが、ルーティングで確認すると"user_info_favorite"になっています。しかしこのままパスをビューに書くとindexのビュー自体が出なくなります。
逆にそのルーティングの最後に"s"を付けて、"user_info_favorites"にすると、ちゃんとindexが表示されます。
しかし、フォロー解除(お気に入り済)を押すと上記のようなルーティングエラーになります。。
ルーティング通り、:idも持ってきているのにエラーになってしまいます。

補足情報

どなたかわかる方いらっしゃったら、ぜひご回答お願いいたいます( ;∀;)

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

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

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

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

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

guest

回答1

0

ベストアンサー

ここでお気に入り解除では以下に書かれていように、user_info_ididの2つのパラメータが必要です。

user_info_favorite DELETE /user_infos/:user_info_id/favorites/:id

該当のコードを見るとuser_info_favorite_pathuser_info_favorite_pathに直し、user_info.idともう一つfavoritesのIDがあると削除できそうです。
以下の1のところに解除したいfavoriteのidが入るイメージです。

<%=link_to "お気に入り済", user_info_favorite_path(user_info.id, 1), class: "white", method: :delete %>

投稿2020/09/30 15:10

hatsu

総合スコア1809

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

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

manami0419

2020/09/30 15:37

ご回答ありがとうございます! 上記のコードで解決しました!ありがとうございます( ´ ▽ ` ) このコードの書き方について質問が2つあります。 ①複数のパラメータを記述することについて 「ここでお気に入り解除では以下に書かれていように、user_info_idとidの2つのパラメータが必要です。」 とおっしゃっているように、私もURIを見た際に2つのidを持ってこないといけないなと思いました。 そこで、(user_info.id, 1)と記述してあるのは、単純に前から値を埋めていけばいいということでしょうか? (URIを左から見て、:user_info_id、 :idの順にパラメータの中に値を埋めればいいということでしょうか?) ②(user_info.id, 1)の1について この1の意味がわかりません( ; ; ) favoriteテーブルの中のID1のレコードにしか影響していないのでは?と考えてしまいます。(実際にはどのユーザーでログインしても、お気に入りを解除できるようになっています。) 1についての具体的な説明をしていただければ嬉しいです( ; ; ) お答えいただいたのに、さらに質問をしてしまい申し訳ありませんが、よろしくお願いいたします( ; ; )
hatsu

2020/09/30 15:57

>URIを左から見て、:user_info_id、 :idの順にパラメータの中に値を埋めればいいということでしょうか? はい、その通りです。 >favoriteテーブルの中のID1のレコードにしか影響していないのでは controllerでparams[:id]とすると、2個目の引数を取得できるだけです。 favo = Favorite.find(params[:id]) favo.destroy のようにしている場合は、params[:id]に毎回1が渡っているのでお気に入りの1を削除しようとします。
manami0419

2020/10/01 01:15

ご返信ありがとうございます! なるほど、そういうことなんですね( ´ ▽ ` ) ご丁寧にありがとうございます! また機会がありましたら、質問にお答えいただければ幸いです! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問