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

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

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

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

解決済

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

study_matome
study_matome

総合スコア33

Ruby on Rails 6

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

2回答

1評価

0クリップ

177閲覧

投稿2022/05/24 10:44

編集2022/05/25 21:51

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

解決したいこと

現在、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

resources :users, only: :show do member do get :favorites end end

モデルの記述

app/models/item.rb

class Item < ApplicationRecord belongs_to :user has_one_attached :image has_many :comments, dependent: :destroy has_many :favorites, dependent: :destroy end

app/models/user.rb

class User < ApplicationRecord #省略 has_many :items, dependent: :destroy has_many :comments, dependent: :destroy has_many :favorites, dependent: :destroy #お気に入り登録されているか確認する def favorited?(item) favorites.exists?(item_id: item.id) end end

app/models/favorite.rb

class Favorite < ApplicationRecord belongs_to :user belongs_to :item end

コントローラーの記述

app/controllers/user_controller.rb

before_action :set_user, only: [:show, :favorites] before_action :authenticate_user!, only: :favorites def show @search_user = @user.id @items = @user.items end def favorites redirect_to root_path unless current_user.id @favorites = Favorite.where(user_id: @user.id).all end private def set_user @user = User.find(params[:id]) end end

ビューの記述

app/views/users/favorite.html.erb

<% if @favorites.present? %> <% @favorites.each do |item| %> <div class="item"> <%= link_to image_tag( item.image , class: :item__img ), item_path(item.id)%> <div class="item__body"> <span class="item__favorite">❤️</span> <span class="favorite__count"><%= item.favorites.count %></span> <%= link_to item.user.name , user_path(item.user_id), class: :item__user %> </div> </div> <% end %> </div> <% end %>

自分で試したこと

問題点の検証

・ 変数の中身

@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

resources :users, only: :show do member do get :favorites end end

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

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

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

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

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails 6

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