前提・実現したいこと
個人アプリ開発にて、いいね機能を実装しています。
いいね機能を実装するにあたり、_favorite.html.haml部分テンプレートを作成したところ下記の画像のようなエラーが発生しました。
該当コードなどを添付いたしますので、ぜひお力添えお願いいたします。
発生している問題・エラーメッセージ
NoMethodError in Posts#index Showing /Users/-/Desktop/projects/snowBgram/app/views/layouts/_favorite.html.haml where line #1 raised: undefined method `id' for nil:NilClass
該当のソースコード
posts_controller.rb
class PostsController < ApplicationController before_action :authenticate_user!, except: [:index] def index @posts = Post.all end def show @post = Post.find(params[:id]) @comment = Comment.new @comments = @post.comments.includes(:user) end def new @post = Post.new end def create @post = Post.new(post_params) @post.user_id = current_user.id if @post.save redirect_to post_path(@post), notice: '投稿されました' else render :new, alert: '投稿できませんでした' end end def edit @post = Post.find(params[:id]) if @post.user != current_user redirect_to posts_path, alert: '不正なアクセスです' end end def update @post = Post.find(params[:id]) if @post.update(post_params) redirect_to post_path(@post), notice: '投稿が更新されました' else render :edit end end def destroy post = Post.find(params[:id]) post.destroy redirect_to posts_path end private def post_params params.require(:post).permit(:title, :body, :image) end end
postsのindex.html.haml
部分テンプレートを呼び出しているのは下から3行目
.posts-index - @posts.each do |post| .posts-box .posts-box__image = link_to post_path(post) do = attachment_image_tag post, :image .posts-profile-box .posts-profile-box__image = link_to user_path(post.user.id) do = attachment_image_tag post.user, :profile_image, fallback: "no-image.png" .posts-profile-box__username %h1= link_to post.user.name, user_path(post.user.id) .posts-profile-box__favoritesBox .posts-profile-box__favoritesBox__favorite = render partial: "layouts/favorite", locals: { post: @post } .posts-profile-updateat = post.updated_at.strftime("%Y-%m-%d %H:%M")
_favorite.html.haml
- if current_user.already_favorited?(post) = link_to post_favorites_path(post), method: :delete do = icon('fas', 'thumbs-up') - else = link_to post_favorites_path(post), method: :post do = icon('far', 'thumbs-up') .posts-profile-box__favoritesBox__count = post.favorites.count
user.rb
already_favorite?で投稿にいいねがあるかどうか判定しています。
class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :name, presence: true, uniqueness: true attachment :profile_image has_many :posts, dependent: :destroy has_many :favorites, dependent: :destroy has_many :comments def already_favorited?(post) self.favorites.exists?(post_id: post.id) end end
試したこと
・idが定義されていないとあるので、post_idが定義されているかどうか確認
・しかしどこをどういじればいいのかわからず、困ってしまった
・データベースには、投稿・ユーザー・いいねのデータが存在しており、それぞれ3つずつぐらいデータがあります
###補足
部分テンプレートを作成する前は、問題なくいいねをつけたり削除したりできていました。
部分テンプレートを作成した途端に上記のエラーが出てきたので、もし解決できる方がいたらご教示お願いします。
プログラミングのレベルは、プログラミングスクールに通って3ヶ月ぐらいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/27 04:11