前提・実現したいこと
Railsでネットのコードを参考にしながらブックマーク機能を作っています。
発生している問題・エラーメッセージ
NoMethodError in Posts#index
undefined method `bookmarked_by?' for #Post::ActiveRecord_Relation:0x000001c6dcfa5ba0
該当のソースコード
route.rb
Rails.application.routes.draw do devise_for :users, controllers: { sessions: 'users/sessions', registrations: 'users/registrations', } # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root 'homes#top' get 'mypage', to: 'homes#mypage' resources :posts, only: [:create, :new, :edit, :update, :destroy] get '/posts/index', to:'posts#index' resources :posts, except: [:index] do resource :bookmarks, only: [:create, :destroy] end end
bookmark.rb
class Bookmark < ApplicationRecord belongs_to :user belongs_to :post validates :user_id, uniqueness: { scope: :post_id } end
post.rb
class Post < ApplicationRecord belongs_to :user has_many :bookmarks, dependent: :destroy def bookmarked_by?(user) bookmarks.where(user_id: user).exists? end end ``` user.rb ``` class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :posts, dependent: :destroy has_many :bookmarks, dependent: :destroy end ``` bookmarks.contoroller.rb ``` class BookmarksController < ApplicationController before_action :authenticate_user! def create @post = Post.find(params[:post_id]) bookmark = @post.bookmarks.new(user_id: current_user.id) if bookmark.save redirect_to request.referer else redirect_to request.referer end end def destroy @post = Post.find(params[:post_id]) bookmark = @post.bookmarks.find_by(user_id: current_user.id) if bookmark.present? bookmark.destroy redirect_to request.referer else redirect_to request.referer end end end ``` index.html.erb ``` <table> <thead> <span>現在ログイン中のユーザー:<%= current_user.name %></span> <%= link_to 'マイページへ', mypage_path %> <tr> <th>投稿者名</th> <th>本文</th> </tr> </thead> <tbody> <% @posts.each do |post| %> <tr> <td><%= post.user.name %></td> <td><%= post.body %></td> <% if post.user == current_user %> <td><%= link_to "編集", edit_post_path(post) %></td> <td><%= link_to "削除", post_path(post), method: :delete %></td> <% else %> <td></td> <td></td> <% end %> <% if @posts.bookmarked_by?(current_user) %> <td><%= link_to "ブックマークを外す", post_bookmarks_path(@post), method: :delete %></td> <% else %> <td><%= link_to "ブックマーク", post_bookmarks_path(@post), method: :post %></td> <% end %> </tr> <% end %> </tbody> </table> ``` mypage.html.erb ``` <%= current_user.name %><br> <%= current_user.email %><br> <%= link_to 'ログアウト', destroy_user_session_path, method: :delete %> <%= link_to '新規作成', new_post_path %> <table> <caption>ブックマーク一覧</caption> <thead> <tr> <th>投稿者名</th> <th>タイトル</th> <th>本文</th> </tr> </thead> <tbody> <% @bookmarks.each do |bookmark| %> <tr> <td><%= bookmark.post.user.name %></td> <td> <%= link_to post_path(bookmark.post) do %> <%= bookmark.post.title %> <% end %> </td> <td><%= bookmark.post.body %></td> </tr> <% end %> </tbody> </table> ``` homes_controller.rb ``` class HomesController < ApplicationController def top end def mypage @bookmarks = Bookmark.where(user_id: current_user.id) end end ``` ### 試したこと post.rb 6行目 def self.bookmarked_by?(user)とすると undefined local variable or method `bookmarks' for #<Class:0x000001c6e1176c78> Did you mean? bookmarked_by? 7行目 @bookmarks.where(user_id: user).exists?とすると undefined method `where' for nil:NilClass とエラーが出ます。 ### 補足情報(FW/ツールのバージョンなど) ruby 2.5.9 rails 6.1.4.1 mysql 5.6.35(MAMP 4.2.0)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/27 02:12
2021/09/27 03:25
2021/09/27 07:06
2021/09/27 14:15