現在お気に入り登録機能を作成しております。
存在しているテーブルは以下となります。(文章が長くなってしまうのでアソシエーションは正しく組んでいるものとさせていただきます。)
・Userテーブル
・Nutritionテーブル ※食材
・Favoriteテーブル(中間テーブル ※カラムはuser_idとnutrition_id)
userが気に入った食材があればお気に入りに登録できるという機能です。
お気登録ボタンと解除ボタンをindex/html.erbに実装しております。
登録はできるのですが、解除ボタンを押すとエラーとなります。
【表示されるエラー分】
ActionController::UrlGenerationError in Nutritions#index
Showing /Users/shotaro_hosoda/projects/berries/app/views/nutritions/index.html.erb where line #38 raised:
No route matches {:action=>"destroy", :controller=>"favorites", :nutrition_id=>27, :user_id=>3}, missing required keys: [:id]
Extracted source (around line #38):
<%= link_to "登録", user_favorites_path(user_id:current_user.id, nutrition_id:nutrition.id), method: :post %> <% else %> ↓エラー箇所ーーーーー <%= link_to "解除", favorite_path(user_id:current_user.id, nutrition_id:nutrition.id), method: :delete %> ーーーーーーーーーーー <% end %>
Favoriteテーブルの主キーを渡せていないことが原因かと思いますが主キーの定義の仕方がわかりません・・・
かなり初歩的な質問となってしまい、申し訳ございません。
この場合、中間テーブルの主キーになりますが、どうやって定義して引数として渡してあげればよいのでしょうか。(記述してあるのは外部キーである、user_idとnutrition_idを渡してfind_byでdeleteしようとあがいているコードです)
-----------以下コードーーーーーーーーーーーーーーーーーー
【ビュー】index.html.erb
登録されていれば解除ボタン表示、登録されていなければ登録ボタンを表示
<%= form_with(url: search_nutritions_path, local: true, method: :get, class: "search-form") do |form| %> <%= form.text_field :keyword, placeholder: "食品名を入力", class: "search-input" %> <%= form.submit "Search", class: "search-btn" %> <% end %> <script src="delete.js"></script> <div class='main-contents'> <h1 class="contents-title">食品一覧(100gあたり)</h1> <table border="5" width="80%" cellpadding="20" bordercolor="#882d91" class="contents-column" align="left"> <tr class="column-name"> <th width="30%" height="50">食品名</th> <th class="column-color1" width="15%">エネルギー(kcal)</th> <th class="column-color1" width="15%">タンパク質(g)</th> <th class="column-color1" width="15%">脂質(g)</th> <th class="column-color1" width="15%">炭水化物(g)</th> <th class="column-color2" width="15%">カリウム(mg)</th> <th class="column-color2" width="15%">カルシウム(mg)</th> <th class="column-color2" width="15%">鉄(mg)</th> <th class="column-color3" width="15%">ビタミンA(mg)</th> <th class="column-color3" width="15%">ビタミンB1(mg)</th> <th class="column-color3" width="15%">ビタミンB2(mg)</th> <th class="column-color3" width="15%">ビタミンC(mg)</th> <th width="15%">食塩相当量(g)</th> <th width="15%">登録ユーザー</th> </tr> <% @nutritions.each do |nutrition| %> <tr height="60" class="content-post"> <td class="ingredient-column" id="ingredient-column"><%= nutrition.ingredient %> <div class="more" id="more"> <ul class="more-list" id="more-list"> <li> <% if current_user.already_favorited?(nutrition) %> <%= link_to '解除', nutrition_favorite_path(id:favorite.id, user_id:current_user.id, nutrition_id:nutrition.id), method: :delete %> <% else %> <%= link_to '登録', edit_nutrition_path(nutrition.id), method: :get %> <% end %> <%= link_to '編集', edit_nutrition_path(nutrition.id), method: :get %> <%= link_to '削除', nutrition_path(nutrition.id), method: :delete, data: { confirm: '削除しますか?'} %> </li> </ul> </div> </td> <td><%= nutrition.calorie %></td> <td><%= nutrition.protein %></td> <td><%= nutrition.lipid %></td> <td><%= nutrition.carbohydrate %></td> <td><%= nutrition.potassium %></td> <td><%= nutrition.calcium %></td> <td><%= nutrition.iron %></td> <td><%= nutrition.vitamin_a %></td> <td><%= nutrition.vitamin_b1 %></td> <td><%= nutrition.vitamin_b2 %></td> <td><%= nutrition.vitamin_c %></td> <td><%= nutrition.salt_equivalent %></td> <td><%= nutrition.user.nickname %></td> </tr> <% end %> </table> </div>
【ルーティング】routes.rb
Rails.application.routes.draw do devise_for :users # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html root to: 'nutritions#index' resources :nutritions do collection do get 'search' end member do post "add", to: "favorites#create" end resource :favorites, only: [:destroy] end resources :users do resources :favorites, only: [:show, :create] end end
【コントローラー】favorites_controller.rb
class FavoritesController < ApplicationController def show @nutritions = current_user.nutritions @user = User.find(params[:id]) @favorites = Favorite.where("user_id = ?", @user) end def create @user_id = current_user.id @nutrition_id = Nutrition.find(params[:nutrition_id]) @favorite = Favorite.new(nutrition_id: @nutrition_id.id, user_id: @user_id) if @favorite.save! redirect_to root_path end end def destroy @favorite = Favorite.find_by(user_id:current_user.id, nutrition_id:params[:nutrition_id]) if @favorite.destroy redirect_to root_path end end private def favorite_params params.require(:favorite).permit(:user_id, :nutrition_id) end end
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ご教授よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/16 04:19 編集
2020/10/16 01:48
2020/10/16 04:24