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

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

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

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

Q&A

解決済

2回答

1999閲覧

【Rails / Ruby】お気に入り(いいね)を一覧表示することができない問題を解決したいです

study_matome

総合スコア37

Ruby on Rails 6

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

1グッド

0クリップ

投稿2022/05/24 10:44

編集2022/05/24 12:27

ご覧いただきまして、ありがとうございます。

解決したいこと

現在、Ruby on Railsで画像投稿アプリのお気に入り機能を実装しています。
お気に入りしたものを一覧表示する機能を作っているのですが、
うまく表示されない状況でした。

お力添えいただけますと、幸いです。

現状

こちらの手順でお気に入り機能の実装は問題なく動いている状態です。

・いいねを押すと色が変わる
・いいねされた状態だとデータベースに「user_id」「item_id」が保存される
・いいねを外した状態だと上記のデータが削除される

発生している問題・エラー

スクリーンショット 2022-05-24 19.11.50.png

NoMethodError in Users#favorites undefined method `image' for #<Favorite:・・・・(英数字)>

config/routes.rb

1 resources :users, only: :show do 2 member do 3 get :favorites 4 end 5 end 6

モデルの記述

app/models/item.rb

1class Item < ApplicationRecord 2 belongs_to :user 3 has_one_attached :image 4 has_many :comments, dependent: :destroy 5 has_many :favorites, dependent: :destroy 6end

app/models/user.rb

1class User < ApplicationRecord 2 #省略 3 has_many :items, dependent: :destroy 4 has_many :comments, dependent: :destroy 5 has_many :favorites, dependent: :destroy 6 7 #お気に入り登録されているか確認する 8 def favorited?(item) 9 favorites.exists?(item_id: item.id) 10 end 11 12end 13

app/models/favorite.rb

1 2class Favorite < ApplicationRecord 3 belongs_to :user 4 belongs_to :item 5end 6

コントローラーの記述

app/controllers/user_controller.rb

1 before_action :set_user, only: [:show, :favorites] 2 before_action :authenticate_user!, only: :favorites 3 4 def show 5 @search_user = @user.id 6 @items = @user.items 7 end 8 9 def favorites 10 redirect_to root_path unless current_user.id 11 @favorites = Favorite.where(user_id: @user.id).all 12 end 13 14 private 15 16 def set_user 17 @user = User.find(params[:id]) 18 end 19end 20

ビューの記述

app/views/users/favorite.html.erb

1<% if @favorites.present? %> 2 <% @favorites.each do |item| %> 3 4 <div class="item"> 5 <%= link_to image_tag( item.image , class: :item__img ), item_path(item.id)%> 6 <div class="item__body"> 7 <span class="item__favorite">❤️</span> 8 <span class="favorite__count"><%= item.favorites.count %></span> 9 <%= link_to item.user.name , user_path(item.user_id), class: :item__user %> 10 </div> 11 </div> 12 <% end %> 13 </div> 14<% end %> 15

自分で試したこと

問題点の検証

・ 変数の中身

@favorites = Favorite.where(user_id: @user.id).all

#<ActiveRecord::Relation [#<Favorite id: 19, user_id: 13, item_id: 4, created_at: "2022-05-24 06:58:40", updated_at: "2022-05-24 06:58:40">, #<Favorite id: 20, user_id: 13, item_id: 9, created_at: "2022-05-24 08:27:23", updated_at: "2022-05-24 08:27:23">, #<Favorite id: 21, user_id: 13, item_id: 10, created_at: "2022-05-24 08:27:25", updated_at: "2022-05-24 08:27:25">, #<Favorite id: 22, user_id: 13, item_id: 11, created_at: "2022-05-24 08:27:26", updated_at: "2022-05-24 08:27:26">, #<Favorite id: 23, user_id: 13, item_id: 5, created_at: "2022-05-24 09:20:39", updated_at: "2022-05-24 09:20:39">]>

→こちらはデータベースのいいねした内容に該当するデータが取得できていました。
(このユーザーは5つの投稿にいいねをしている)

<% if @favorites.present? %> <% @favorites.each do |item| %> <% end %> <% end %>

→@favoritesのデータが存在していたら表示という条件式で表示されていました(HTMLのみ)
→いいねした内容に該当する5つが表示されてました(HTMLのみ)

<%= link_to item.user.name , user_path(item.user_id), class: :item__user %>

→表示はされましたが、リンク先・表示するユーザーが全て自分になってしまいました。
(本来は投稿した画像に基づくユーザーを表示させたい)

要因になりそうな記述点

以下を 「get :favorites, on: :collection」 と記載している方もいて、懸念点の1つでした。

config/routes.rb

1 resources :users, only: :show do 2 member do 3 get :favorites 4 end 5 end

データは取れているので、アソシエーションが間違っているためitemのデータを呼び出せないか、
呼び出す以下の記述が間違えているのではないかと考えています。

<%= link_to image_tag( item.image , class: :item__img ), item_path(item.id)%>
補足

中間テーブルとしてfavoriteモデルを作成しています。
(throughオプションを記述したところ、エラーが出てしまったため、未記述でした)

色々なサイトやご質問も参考にしながら進めたのですが、解決することが難しかったため、ご質問させていただきました。

お力添えいただけますと嬉しいです。

shinoharat👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

Favorite のインスタンスに対して image メソッドを呼び出しているのが原因です。
Item のインスタンスに対して image を呼ぶようにしてください。

diff

1 <% if @favorites.present? %> 2- <% @favorites.each do |item| %> 3+ <% @favorites.each do |favorite| %> 4+ <% item = favorite.item %> 5 6 <div class="item"> 7 <%= link_to image_tag( item.image , class: :item__img ), item_path(item.id)%> 8 <div class="item__body"> 9 <span class="item__favorite">❤️</span> 10 <span class="favorite__count"><%= item.favorites.count %></span> 11 <%= link_to item.user.name , user_path(item.user_id), class: :item__user %> 12 </div> 13 </div> 14 <% end %> 15- </div> この閉じタグは余分かと思います。 16 <% end %> 17

投稿2022/05/25 04:44

shinoharat

総合スコア1676

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

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

study_matome

2022/05/25 12:50

shinoharatさん 丁寧に教えていただきまして、ありがとうございました! またdivタグの記載も助かりました。 4時間ほどトライアンドエラーで、悩んでいたので本当に助かりました。 感謝申し上げます。
guest

0

shinoharatさんにいただいたコメントで解決いたしました。
ありがとうございました!

投稿2022/05/25 12:51

study_matome

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問