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

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

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

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

Q&A

解決済

1回答

1982閲覧

Routing Errorが治らない

takeke

総合スコア60

Ruby

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

0グッド

0クリップ

投稿2018/04/09 09:09

ルート関連のエラーでなかなか自力で解決できなかったので質問させていただきます。

タイトル通りRouting Errorなのですが、現在ECサイトを作成していまして、そこでお気に入り機能を追加しようとしたらエラーが出てきてしまいました。

実際やったことはお気に入りに追加する機能と、お気に入りから削除する機能の導入です。追加する方は問題なくできたのですが削除の方でのエラーが起きました

エラー内容は、No route matches [DELETE] "/products/16/favorites"と出てきて、該当のルートは、
product_favorite_path DELETE /products/:product_id/favorites/:id(.:format)
favorites#destroy

成功した追加の方のルートは
product_favorites_path POST /products/:product_id/favorites(.:format)
favorites#create

となっています。実際の記述は
views/store/index.html.erb

<% @products.each do |product| %> <% if product.favorited_by? current_user %> <%= link_to "お気に入り解除", product_favorites_path(product), method: :delete %> <% else %> <%= link_to "お気に入り追加", product_favorites_path(product), method: :post %> <% end %> <% end %>

favorites.controller.rb

class FavoritesController < ApplicationController before_action :authenticate def create @product = Product.find(params[:product_id]) @favorite = current_user.favorites.build(product: @product) if @favorite.save redirect_to store_path, notice:"お気に入りに登録しました" else redirect_to store_path, notice:"この商品はお気に入りに登録できません" end end def destroy @favorite = current_user.favorites.find_by!(product_id: params[:product_id]) @favorite.destroy redirect_to store_path, notice:"お気に入りを解除しました" end end

favorite.rb

class Favorite < ApplicationRecord belongs_to :product belongs_to :user validates :user, presence: true validates :user_id, uniqueness:{scope: :product_id} validates :product, presence: true end

routes.rb

resources :users, only: [:index, :show] do get :favorites, on: :member end resources :products do resources :favorites, only: [:create, :destroy] get :who_bought, on: :member end

関係していそうな箇所だけピックアップしてみました。

以上になります。
個人的にきになる所は、最初のルートの表示でお気に入り追加のパスがproduct_favorites_pathでエラーの削除の方がproduct_favorite_pathと、favoritesとfavoriteといふうに[s]の差がある所と、削除の方のパスの/products/:product_id/favorites/:id(.:format)となってる最後のidが怪しいとは思っているのですが、これをどうしたらいいのかわからず質問に至りました。

もし改善案などわかる方いましたらご教授の方宜しくお願いしますm(._.)m

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

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

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

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

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

guest

回答1

0

ベストアンサー

ProductとFavoriteは1対1なのでしょうか?

1対1(has_one)であれば、routes.rbの書き方が間違っています。

ruby

1 resources :products do 2 resource :favorite, only: [:create, :destroy] # resourcesではなくresourceを使用 3 get :who_bought, on: :member 4 end

1対多(has_many)であれば、deleteの際にIDが必要となります。

ruby

1<%= link_to "お気に入り解除", product_favorite_path(product, favorite), method: :delete %> # どこかで削除対象の`favorite`インスタンスを取得する必要がある

投稿2018/04/09 11:15

k.tada

総合スコア1679

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

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

takeke

2018/04/11 07:50

回答ありがとうございました!正にその通りで、resourcesのsが不要でした。今までroutes.rbでresourcesしか書いたことなかったので何の疑いもなくsつけていました>< また新たなエラーに立ち向かっている所なのでまたご縁があれば宜しくお願い致しますm(._.)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問