プログラミング初学者です。
ruby on railsにてレシピ投稿サイトを作成中で、(rails5)「いいね機能」を実装する際に、エラーが発生しました。
「いいね」を取り消すリンクでエラーが起こっています。
問題は以下のコードです。
※userモデルとrecipeモデルを紐付けるlikeモデルを作成しております。
問題の箇所(index.html.slim)
ruby
1.row 2 - @recipes.each do |recipe| 3 .card.col-md-4 4 .card-body 5 p.card-text 6 = link_to recipe.title, recipe 7 = link_to '削除', recipe, method: :delete 8 - if recipe.picture.present? 9 = image_tag recipe.picture.thumb.url, id: :picture_prev 10 11 - if current_user.likes.find_by(recipe_id: recipe.id) 12 = link_to 'いいね解除', recipe_like_path(recipe), method: :delete 13 - else 14 = link_to 'いいね', recipe_likes_path(recipe), method: :post 15
一番下の「link_to 'いいね', recipe_likes_path(recipe)」のところは上手く機能しています。
しかし、下から三行目の「link_to 'いいね解除', recipe_like_path(recipe)」が上手く機能していないようです。
エラー画面は以下の通りです。
試したこと
「missing required keys: [:id]」とあるので、「idが取得できていないのか?」と思い、
http://localhost:3000/rails/info/routesからルートを確認すると、
「recipe_id」は取得できているが、recipe_like_pathの:idを取得できていないとわかり、
recipe_like_path(recipe), method: :delete
から
recipe_like_path(recipe,recipe.id), method: :delete
へ変更したところ、正常に動作するようになりました。
※recipe_like_path(recipe,recipe), method: :deleteでも動作しているようです。
しかし、参考サイト1、参考サイト2を見ても、recipe_like_path(recipe,recipe.id)のような記述になっていません。
動いているから良しとするのか、それとも一見動いているように見えるだけなのか、、、
何か抜けている点があるでしょうか。
ご意見をお伺いできればと思います。
routes.rbとlikes_controllerを参考までに以下に記載します。
質問に不慣れな点があり、至らぬ点、わかりにくい点があるかもしれませんがよろしくお願いします。
他記述すべきコードなどございましたらお教えいただけますと幸いです。
routes.rb
Rails.application.routes.draw do devise_for :users, controllers: { registrations: 'users/registrations', sessions: 'users/sessions', } root 'homes#index' get 'homes/about', to: 'homes#about' resources :recipes do resources :likes, only: %i[create destroy] end resources :comments, only: %i[create destroy] end
likes_controller.rb
class LikesController < ApplicationController before_action :authenticate_user! def create @like = current_user.likes.new(recipe_id: params[:recipe_id]) if @like.save flash[:notice] = "いいねしました。" redirect_to recipes_url end end def destroy @like = Like.find_by(user_id: current_user.id, recipe_id: params[:recipe_id]) if @like.destroy flash[:notice] = "いいねを取り消しました。" redirect_to recipes_url end end end
補足情報(FW/ツールのバージョンなど)
開発環境:docker
ruby:2.5.1
rails:5.2.3
参考サイト1「いいね機能の実装(rails5)」
参考サイト2「【Rails】いいね機能の実装手順」
追記(参考サイトのroutes.rb)
ちなみにですが、routes.rbにおいて、resources :likesはresources :recipesの階層下にありますが、
階層を設けずに、並列して記述した場合でも、別のエラーが発生致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/07 14:32 編集