🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Ruby on Rails

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

Q&A

解決済

1回答

2493閲覧

【Rails】お気に入り機能の実装ができません。解決方法を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/02/11 05:21

編集2021/02/11 23:01

前提・実現したいこと

Railsでレシピサイトを作っています。
現在レシピのお気に入り機能を実装中ですが、お気に入りボタンをクリックしてもお気に入り登録されません。
解決方法を教えてください。

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

お気に入りボタンをクリックしてもエラー表示はされません。

該当のソースコード

#####ルーティング
routes.rb

resources :recipes do collection do get 'search' end resources :favorites, only: [:create, :destroy] end

#####モデル
user.rb

has_many :favorites, dependent: :destroy has_many :fav_recipes, through: :favorites, source: :recipe

recipe.rb

has_many :favorites, dependent: :destroy has_many :users, through: :favorites

favorite.rb

belongs_to :user belongs_to :recipe

#####コントローラー
favorite_controller

def create @recipe = Recipe.find(params[:id]) if @recipe.user_id != current_user.id @favorite = Favorite.create(user_id: current_user.id, recipe_id: @recipe.id) end end def destroy @recipe = Recipe.find(params[:id]) @favorite = Favorite.find_by(user_id: current_user.id, recipe_id: @recipe.id) @favorite.destroy end

#####ビュー
recipes.show.html.erb

<div class="d-inline-block" id="favorite_<%= @recipe.id %>"> <%= render partial: 'favorites/favorite_button', locals: {recipe: @recipe} %> <%= @recipe.user.name %> </div>

favorites._favorite_button.html.erb

<% if !Favorite.exists?(user_id: current_user.id, recipe_id: recipe.id) %> <%= link_to recipe_favorites_path(recipe), method: :post, remote: true do %> <i class="far fa-star"></i> <% end %> <span class="star-count1"><%= recipe.favorites.count %></span> <% else %> <%= link_to recipe_favorites_path(recipe), method: :delete, remote: true do %> <i class="fas fa-star"></i> <% end %> <span class="star-count2"><%= recipe.favorites.count %></span> <% end %>

#####Ajax
以下のようにAjaxにも対応させています。

favorites.create.js.erb

$('#favorite_<%= @recipe.id %>').html("<%= j(render partial: 'favorites/favorite_button', locals: { recipe: @recipe }) %>");

favorites.destroy.js.erb

$('#favorite_<%= @recipe.id %>').html("<%= j(render partial: 'favorites/favorite_button', locals: { recipe: @recipe }) %>");

application.js

//= require jquery //= require rails-ujs

Gemfile

gem "jquery-rails"

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

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

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

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

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

siruku6

2021/02/11 08:23

確認なのですが ①users_controllerにある以下の分岐では、ifの条件を満たしていますか? if @recipe.user_id != current_user.id つまり、recipeのuser_idと、操作しているユーザーのidは異なっていますか?(別のユーザーですか?) ②何かエラーは表示されますか?
退会済みユーザー

退会済みユーザー

2021/02/11 22:56

ありがとうございます! ①異なっています。 試しにアカウント2つ作って、ログインユーザーでないユーザーが投稿したレシピでお気に入り登録試しているのですが、上手く起動しません。 ②エラーは表示されません。 画面は何も変わらずです。
siruku6

2021/02/13 03:30 編集

①の確認はそれで大丈夫だと思います ②ですが、ブラウザの開発者ツール(F12で開ける)を開いた状態でお気に入り登録してもエラーが出ていないかどうかも確認してみてもらえますか?? >remote: trueだとエラー表記されないんですね。 >ログで見ると、以下のようにエラーが起きてるのがわかりました。 と思ったら、既にエラーの内容を確認されてましたね!
guest

回答1

0

ベストアンサー

なんかちょっとづつずれてるように思えます。
users_controller の create で Favorite.create してますが、ここに来ます? 仮に来るにしても users_controller の create はUserを作るべきです。

FavoriteController#createで作ってください。

で、
viewでは link_to recipe_favorites_path(recipe) なので FavoriteController に向かっていると思います。FavoriteControllerを見せてください。

追記
remote: true の場合はエラーが起きても何も起きません。ブラウザーの検証でみるとか、logで見るとか確認してみてください。
Favoriteが作られれて居ないのか、作られているが反映してくれないのか、を確認しましょう。
リロードしてもお気に入り出ませんか?

追記2
Parameters: {"recipe_id"=>"3"} になってますね

投稿2021/02/11 11:26

編集2021/02/12 00:23
winterboum

総合スコア23567

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

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

退会済みユーザー

退会済みユーザー

2021/02/11 22:59

ありがとうございます! すみません、質問中のコントローラーですが、user_controllerではなく、favorite_controllerです。 ファイル名の表記間違えてました。編集して直しておきます。
退会済みユーザー

退会済みユーザー

2021/02/11 23:43

追記コメントありがとうございます。 remote: trueだとエラー表記されないんですね。 ログで見ると、以下のようにエラーが起きてるのがわかりました。 ーーーーーー Started POST "/recipes/3/favorites" for 111.108.24.185 at 2021-02-11 23:24:50 +0000 Cannot render console from 111.108.24.185! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by FavoritesController#create as JS Parameters: {"recipe_id"=>"3"} User Load (1.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 ↳ app/helpers/sessions_helper.rb:3 Completed 404 Not Found in 4ms (ActiveRecord: 1.0ms) ActiveRecord::RecordNotFound (Couldn't find Recipe without an ID): app/controllers/favorites_controller.rb:5:in `create' ーーーーーー ちなみに、リロードしてもお気に入り出ません。
退会済みユーザー

退会済みユーザー

2021/02/13 03:07

Parameters: {"recipe_id"=>"3"}になっており、Recipeのidが渡されてないんだな、みたいなことかと思われますが、どのようにすればよいでしょうか。 form_withだとhiddenを使えば良いと思いますが、link_toの場合は使えなさそうですので。
siruku6

2021/02/13 03:36 編集

`recipe_id`が渡ってきているので、 @recipe = Recipe.find(params[:id]) の部分を @recipe = Recipe.find(params[:recipe_id]) にすれば話が先に進みそうですね。 -------------------------------- 今回のroutingではresourcesのネストを行っており、`id`という名前ではどのテーブルのidなのかが区別できなさそうです。 そのため、railsが自動的に`id`という名前を`recipe_id`に書き換えてくれている可能性がありそうです。(確証はありませんが)
winterboum

2021/02/13 04:26

@favorite = Favorite.create(user_id: current_user.id, recipe_id: @recipe.id) を @favorite = Favorite.create(user_id: current_user.id, recipe_id: params[:recipe_id]) にすれば作られます
退会済みユーザー

退会済みユーザー

2021/02/13 05:59

siruku6さん、winterboumさん ありがとうございます! 無事解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問