tatsuya-k
@tatsuya-k (Kimura Tatsuya)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

いいね機能を実装しようとしたらNoMethodErrorが出てしまった。

前提・実現したいこと

Railsで写真投稿アプリを作っています
いいね機能を実装中に以下のエラーメッセージが発生しました。
難しいかもしれませんがお力を貸していただけると幸いです。
NoMethodError in Recipes#show

Showing /Users/projects/shoes-recipe/app/views/recipes/show.html.erb where line #8 raised:
undefined method `id' for nil:NilClass

発生している問題・エラーメッセージ

Extracted source (around line #8):
  </p>

  <% if Like.find_by(user_id: @current_user.id, recipe_id: @recipe.id) %> **←赤字部分**
     <%= link_to("/likes/#{@recipe.id}/destroy", {method: "recipe"}) do %>
     <span class="fa fa-heart like-btn-unlike"></span>
        <% end %>

該当のソースコード

show.html.erb

<main class="main">
  <div class="inner">
    <div class="recipe__wrapper">
      <p class="recipe__hedding">
        <%= @recipe.title %>
      </p>

      <% if Like.find_by(user_id: @current_user.id, recipe_id: @recipe.id) %>
        <%= link_to("/likes/#{@recipe.id}/destroy", {method: "recipe"}) do %>
        <span class="fa fa-heart like-btn-unlike"></span>
        <% end %>
      <% else %>
       <%= link_to("/likes/#{@recipe.id}/create", {method: "recipe"}) do %>
       <span class="fa fa-heart like-btn"></span>
      <% end %>
    <% end %>
    <%= @likes_count %>


      <%= link_to "by #{@recipe.user.name}", user_path(@recipe.user), class: :recipe__user %>
      <% if current_user == @recipe.user%>
        <div class="recipe__manage">
          <%= link_to "編集する", edit_recipe_path(@recipe), class: :recipe__btn %>
          <%= link_to "削除する", recipe_path(@recipe), method: :delete,  class: :recipe__btn %>
        </div>
        <% end %>
      <div class="recipe__image">
        <%= image_tag @recipe.image %>
      </div>
      <div class="recipe__body">
        <div class="recipe__detail">
          <p class="detail__title">使った道具</p>
          <p class="detail__message">
            <%= @recipe.cream %>
          </p>
        </div>
        <div class="recipe__detail">
          <p class="detail__title">手入れの手順</p>
          <p class="detail__message">
            <%= @recipe.procedure %>
          </p>
        </div>
      </div>
      <div class="recipe__comments">
        <% if user_signed_in? %>
          <%= form_with model: [@recipe, @comment], local: true do |f|%>
            <div class="field">
              <%= f.label :text, "コメント" %><br />
              <%= f.text_field :text %>
            </div>
            <div class="actions">
              <%= f.submit "送信する", class: :form__btn  %>
            </div>
          <% end %> 
        <% end %>
        <ul class="comments_lists">
          <% @comments.each do |comment| %>
            <li class="comments_list">
              <%= comment.text%>
              <%= link_to "(#{comment.user.name})", user_path(comment.user), class: :comment_user %>
            </li>
          <% end %>
          <ul>
      </div>
    </div>
  </div>
</main>

likes_controller.rb


class LikesController < ApplicationController
  before_action :authenticate_user

  def create
    @like = Like.new(user_id: @current_user.id, recipe_id: params[:recipe_id])
    @like.save
    redirect_to("/recipes/#{params[:recipe_id]}")
  end

  def destroy
    @like = Like.find_by(user_id: @current_user.id, recipe_id: params[:recipe_id])
    @like.destroy
    redirect_to("/recipes/#{params[:recipe_id]}")
  end
end
routes.rb

Rails.application.routes.draw do
  devise_for :users
  root to: "recipes#index"
  resources :recipes, only: [:new, :create, :show, :edit, :update, :destroy] do
  resources :comments, only: :create 
  resources :likes, only: [:create, :destroy]
  end
  resources :users, only: :show
end

試したこと

697ec87153438d8799d924d4aea0c97f.png

ターミナルを見たところrecipeのidは取得できているのだが、userのidが取得できていないようです。
progateのやり方に沿って作業をしていたのだがどうしてもうまくいきません。
お力を貸していただけると幸いです。

0

3Answer

エラーメッセージのまま読むと
RecipesControllerのshowアクションから
show.html.erbをレンダリングしようとしている時のエラーに見えますが、
該当のアクション内で@current_userという
インスタンス変数をテンプレート(ビュー)に渡していますか?

1Like

Comments

  1. @tatsuya-k

    Questioner

    ありがとうございます。RecipesControllerのshowアクションにuser_id: @current_user.idと書き込むことで表示することができました。

This answer has been deleted for violation of our Terms of Service.

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌