ご覧いただきまして、ありがとうございます。
解決したいこと
現在、Ruby on Railsで画像投稿アプリのお気に入り機能を実装しています。
お気に入りしたものを一覧表示する機能を作っているのですが、
うまく表示されない状況でした。
お力添えいただけますと、幸いです。
現状
こちらの手順でお気に入り機能の実装は問題なく動いている状態です。
・いいねを押すと色が変わる
・いいねされた状態だとデータベースに「user_id」「item_id」が保存される
・いいねを外した状態だと上記のデータが削除される
発生している問題・エラー
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オプションを記述したところ、エラーが出てしまったため、未記述でした)
色々なサイトやご質問も参考にしながら進めたのですが、解決することが難しかったため、ご質問させていただきました。
お力添えいただけますと嬉しいです。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/25 12:50