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

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

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

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

Q&A

1回答

1437閲覧

(rails5)いいね機能を実装中に、link_toメソッドでエラーが発生する。

hasegawa-kei

総合スコア4

Ruby on Rails 5

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

1グッド

2クリップ

投稿2019/11/05 15:21

編集2019/11/07 14:23

プログラミング初学者です。
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)

参考サイト1のroutes.rb
参考サイト1のroutes.rb

参考サイト2のroutes.rb
参考サイト2のroutes.rb

ちなみにですが、routes.rbにおいて、resources :likesはresources :recipesの階層下にありますが、
階層を設けずに、並列して記述した場合でも、別のエラーが発生致します。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答1

0

routes.rbで

resources :recipes do resources :likes, only: %i[create destroy] end

と階層にしているのでそうなります。
参考サイトでは

resources :recipes do end resources :likes, only: %i[create destroy]

と外に出ていませんか?

投稿2019/11/07 11:36

winterboum

総合スコア23329

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

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

hasegawa-kei

2019/11/07 14:32 編集

ご回答いただき、感謝いたします。 質問に追記させていただきましたが、参考サイト1、2でもlikesは外に出ていないように思えます。 また、ご指摘の通りに訂正すると、いいねのリンクをしてもいいね状態に切り替わらなかったり(いいね解除との表記が出ない)、いいね解除しようとすると、likes_controllerの@like.destoryのエラーが出たり(undefined method `destroy' for nil:NilClassとなります。)してしまいます。 ※routes.rbを変更したことにより、index.html.slimのrecipe_like_path(recipe,recipe.id)→like_path(recipe)へ recipe_likes_path(recipe)→likes_path(recipe)へ変更。 また、ご意見いただけますと大変助かります。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問