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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

HTML

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

Q&A

解決済

1回答

1136閲覧

[Rails]いいねした投稿の表示でエラーが起こってしまいます

tkrhashi

総合スコア2

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

HTML

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

0グッド

0クリップ

投稿2020/05/07 02:59

前提・実現したいこと

Instagramのようないいね機能付きのwebアプリを作成しています。
一見きちんと実装できたかのように見えたのですが、いいねした投稿自体が削除されるとエラーが起きるようになってしまいました。

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

NoMethodError in Users#likes Showing /home/vagrant/tweet_app/app/views/users/likes.html.erb where line #42 raised: undefined method `user' for nil:NilClass Did you mean? super Extracted source (around line #42): <div class="post-left"> <%= link_to image_tag(post.user.image.to_s), "/users/#{post.user.id}"%> #42 </div> <div class="post-right"> <div class="post-user-name">

該当のソースコード

全て記載すると長くなってしまうので、関係ありそうなところだけ抜粋致しました。
もし足りない情報があれば追記します。

html

1 <% @likes.each do |like| %> 2 <% post = Post.find_by(id: like.post_id) %> 3 4 <div class="posts-index-item"> 5 <div class="post-left"> 6 <%= link_to image_tag(post.user.image.to_s), "/users/#{post.user.id}"%> 7 </div> 8 <div class="post-right"> 9 <div class="post-user-name"> 10 <%= link_to(post.user.name, "/users/#{post.user.id}") %> 11 </div> 12 </div> 13 <div class="content"> 14 <div class="index-image"> 15 <%= link_to image_tag(post.image_name.to_s), "/posts/#{post.id}" %> 16 </div> 17 <%= simple_format link_to(post.content, "/posts/#{post.id}") %> 18 </div> 19 </div> 20 <% end %>

このページでエラーが起こっています。ユーザーがいいねした投稿を一覧で表示する画面です。

html

1 <% @user.posts.each do |post| %> 2 <div class="posts-index-item"> 3 <div class="post-left"> 4 <!--<img src="<#%= "/user_images/#{post.user.image_name}" %>">--> 5 <%= link_to image_tag(@user.image.to_s), "/users/#{post.user.id}" %> 6 </div> 7 <div class="post-right"> 8 <div class="post-user-name"> 9 <%= link_to(post.user.name, "/users/#{post.user.id}") %> 10 </div> 11 </div> 12 <div class="content"> 13 <div class="index-image"> 14 <%= link_to image_tag(post.image_name.to_s), "/posts/#{post.id}" %> 15 </div> 16 <%= simple_format link_to(post.content, "/posts/#{post.id}") %> 17 </div> 18 </div> 19 <% end %>

こちらはユーザーが投稿した投稿を一覧で表示するページです。
構造はほぼ同じはずですが、エラーは起こっていません。削除した投稿は問題なく一覧からも削除されます。

users_controller

ruby

1 def show 2 @user = User.find_by(id: params[:id]) 3 @relationships_count = Relationship.where(followed_id: @user.id).count 4 end 5 6 def likes 7 @user = User.find_by(id: params[:id]) 8 @likes = Like.where(user_id: @user.id).order(created_at: :desc) 9 @relationships_count = Relationship.where(followed_id: @user.id).count 10 end 11

posts_controller

ruby

1 def new 2 @post = Post.new 3 end 4 5 def create 6 @post = Post.new( 7 content: params[:content], 8 content2: params[:content2], 9 content3: params[:content3], 10 user_id: @current_user.id, 11 prefecture:params[:prefecture], 12 category:params[:category], 13 with:params[:with], 14 image_name: "0.jpg", 15 image_name2: ".jpg", 16 image_name3: ".jpg" 17 ) 18 @post.save 19 20 @post.image_name = params[:image_name] 21 @post.image_name2 = params[:image_name2] 22 @post.image_name3 = params[:image_name3] 23 24 if @post.save 25 flash[:notice] = "旅行記を作成しました!!" 26 redirect_to("/users/#{@current_user.id}") 27 else 28 render("posts/new") 29 end 30 31 end 32 33 def destroy 34 @post = Post.find_by(id: params[:id]) 35 @post.destroy 36 flash[:notice] = "投稿を削除しました!" 37 redirect_to("/users/#{@current_user.id}") 38 end

試したこと

一度 rails db:drop してからもう一度 rails db:migrate をしてやり直しました。
投稿を削除するまでは問題なく動いたのですが、やはり投稿を削除すると同様なエラーが生じてしまいました。
エラーが出ている箇所をコメントアウトしたところ、別の行の.userで同様のエラーが生じました。

補足情報(FW/ツールのバージョンなど)

Rails 5.2
CentOS 6.8

なぜ投稿を削除したらいいねの表示でエラーが起きるのか、どうしたらエラーが解消できるのか、自分ではいくら調べたり考えたりしてもわからなかったので質問させてください。
何かわかる方、どのようなことでも構いませんのでご教授ください。
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

class Post に has_many :likes があると思います。
ここを has_many :likes, dependent: :destroy としてください。
Postを削除した時に、一緒にLikeを削除していないためにエラーとなっています。

で、問題は今まで削除してしまったPostへのLikeが残っているとエラーは出たままです。
rails console にて
post_ids = Post.ids Like.where.not(post_id: post_ids).delete_all
してやもめを削除してください。

投稿2020/05/07 05:46

winterboum

総合スコア23329

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

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

tkrhashi

2020/05/07 09:38

ご指摘いただいた通りでした。 class Postを編集して無事にエラーは解消されました。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問