質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1690閲覧

【いいね機能の実装】undefined method `id' for nil:NilClassのエラーを解決したい。

susume

総合スコア13

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/07/24 10:19

前提・実現したいこと

個人アプリ開発にて、いいね機能を実装しています。

いいね機能を実装するにあたり、_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ヶ月ぐらいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

indexでは @postsはていぎしてありますが、@postは定義していません。
ですので  locals: { post: @post } で nil が渡されます。

  • @posts.each do |post| のloopの中ですので

locals: { post: post } です

投稿2020/07/24 11:37

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

susume

2020/07/27 04:11

無事に解決しました! 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問