前提・実現したいこと
ruby on rails 初学者です。
写真投稿アプリを制作中、
いいね機能の実装の際にエラーメッセージが発生しました。
現状、deviseを導入した上で、
likeテーブルを作り、
自分がいいねをしていない場合は「いいね」、
いいねをしている場合は「いいねを取り消す」という処理にしたいです。
こちらの記事を参考にしました。
https://eiji-hb.hatenablog.com/entry/2019/10/23/151224
発生している問題・エラーメッセージ
NoMethodError in Posts#index undefined method `id' for nil:NilClass
該当のソースコード
app/view/posts/index.html.haml
haml
1.post_lists 2 - @posts.each do |post| 3 %div.post_content 4 %div.post_content__upper_box 5 %div.post_content__upper_box__name 6 = link_to post.user.name, user_path(post.user), class: "post_content__upper_box__username" 7 - if user_signed_in? && current_user.id == post.user_id 8 = link_to "投稿を削除", post_path(post.id), method: :delete, class: "post_content__upper_box__delete" 9 = image_tag post.image.url, class: "post_content__image" 10 %div.post_content__rower_box 11 %div.post_content__rower_box__caption 12 = post.text 13 %div.post_content__rower_box__like 14 -if current_user.likes.find_by(post_id: @post.id) 15 = link_to 'いいね!を取り消す', post_like_path(@post), method: :delete 16 -else 17 = link_to 'いいね!', post_likes_path(@post), method: :post
app/config/routes.rb
ruby
1Rails.application.routes.draw do 2 devise_for :users 3 root to: 'posts#index' 4 5 resources :users, only: [:index, :show] 6 resources :posts, only: [:index, :new, :create, :destroy] do 7 resources :likes, only: [:create, :destroy] 8 end 9end
app/controllers/posts_controller.rb
ruby
1class PostsController < ApplicationController 2 before_action :authenticate_user!, only: [:show, :new] 3 4 def index 5 @posts = Post.includes(:user).order(created_at: :DESC) 6 @like = Like.new 7 end 8 9 def show 10 @post = Post.find(params[:id]) 11 end 12 13 def new 14 @posts = Post.new 15 end 16 17 def create 18 @post = Post.new(post_params) 19 if @post.save 20 redirect_to root_path 21 else 22 render :new 23 end 24 end 25 26 def destroy 27 post = Post.find(params[:id]) 28 post.destroy 29 redirect_to root_path 30 end 31 32 private 33 def post_params 34 params.require(:post).permit(:image, :text).merge(user_id: current_user.id) 35 end 36 37end
app/controllers/likes_controller.rb
ruby
1class LikesController < ApplicationController 2 before_action :set_post, only: [:create, :destroy] 3 def create 4 @like = current_user.likes.create(like_params) 5 redirect_to root_path(@post) 6 end 7 8 def destroy 9 @like = Like.find_by(like_params, user_id: current_user.id) 10 @like.destroy 11 redirect_to root_path(@post) 12 end 13 14 private 15 def set_post 16 @post = Post.find(params[:post_id]) 17 end 18 19 def like_params 20 params.permit(:post_id) 21 end 22end 23
app/controllers/users_controller.rb
ruby
1class UsersController < ApplicationController 2 3 def index 4 @users = User.all 5 end 6 7 def show 8 @user = User.find(params[:id]) 9 @posts = @user.posts 10 end 11 12end 13
試したこと
app/view/posts/index.html.haml内の条件分岐、「-if current_user.likes.find_by(post_id: @post.id)」以下において、post_idが取れていないことが原因かと考え、routes.rbのネストができているか確認をしてみました。
補足情報(FW/ツールのバージョンなど)
Rails 5.2.4.1
ruby 2.5.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。