前提・実現したいこと
twitterのような投稿機能をもつウェブアプリを作成しています。
投稿一覧画面(posts/index)にアクセスしたところ、以下のようなエラーが出てしまいました。
なぜ投稿詳細画面(posts/show)のところでエラーが出ているのかわかりません。
(showは問題なく表示できています)
一日中いろいろ試行錯誤したのですが自力では直せず、質問させてください。よろしくお願い致します
発生している問題・エラーメッセージ
NoMethodError in PostsController#show undefined method `user' for nil:NilClass Did you mean? super Extracted source (around line #21): def show @post = Post.find_by(id:params[:id]) @user = @post.user ←この行が色付けされています @likes_count = Like.where(post_id: @post.id).count end Rails.root: /home/vagrant/tweet_app Application Trace | Framework Trace | Full Trace app/controllers/posts_controller.rb:21:in `show' Request Parameters: {"id"=>"index"} Toggle session dump Toggle env dump Response Headers: None
該当のソースコード
ruby,html
1Rails.application.routes.draw do 2 3routes.rb------------- 4 post "likes/:post_id/create" => "likes#create" 5 post "likes/:post_id/destroy" => "likes#destroy" 6 7 get "login" => "users#login_form" 8 post "login" => "users#login" 9 10 post "logout" => "users#logout" 11 12 post "users/:id/update" => "users#update" 13 14 get "users/:id/edit" =>"users#edit" 15 post "users/create" => "users#create" 16 get "signup" => "users#new" 17 get 'users/index' 18 get "users/:id" => "users#show" 19 20 get"users/:id/likes" => "users#likes" 21 22 resources :posts do 23 resources :comments 24 end 25 26 get "posts/index" => "posts#index" 27 get "posts/hokkaido" => "posts#hokkaido" 28 get "posts/hokkaido/food" => "posts#hokkaido_food" 29 get "posts/hokkaido/shop" => "posts#hokkaido_shop" 30 31 get "posts/new" => "posts#new" 32 get "posts/:id" => "posts#show" 33 post "posts/create" => "posts#create" 34 get "posts/:id/edit" => "posts#edit" 35 post "posts/:id/update" => "posts#update" 36 post "posts/:id/destroy" => "posts#destroy" 37 38 get "/" => "home#top" 39 get "about" => "home#about" 40 get "map" => "home#map" 41 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 42end 43------------------ 44post.rb------- 45 46class Post < ApplicationRecord 47 has_many :comments 48 49 validates :content, {presence: true, length: {maximum: 1000}} 50 validates :user_id, {presence: true} 51 52 53 54 def user 55 User.find_by(id: self.user_id) 56 end 57 58 59end 60------------- 61 62posts_controller.rb------------- 63 64class PostsController < ApplicationController 65 before_action :authenticate_user 66 before_action :ensure_correct_user,{only: [:edit,:update,:destroy]} 67 68 def index 69 @posts = Post.all.order(created_at: :desc) 70 end 71 72 def hokkaido 73 @postsP = Post.where(prefecture:"北海道", category:"Place") 74 end 75 def hokkaido_food 76 @postsF = Post.where(prefecture:"北海道", category:"Food") 77 end 78 def hokkaido_shop 79 @postsS = Post.where(prefecture:"北海道", category:"Shop") 80 end 81 82 def show 83 @post = Post.find_by(id:params[:id]) 84 @user = @post.user 85 @likes_count = Like.where(post_id: @post.id).count 86 end 87 88 def new 89 @post = Post.new 90 end 91 92 def create 93 @post = Post.new( 94 content:params[:content], 95 user_id: @current_user.id, 96 prefecture:params[:prefecture], 97 category:params[:category], 98 with:params[:with] 99 ) 100 if @post.save 101 flash[:notice] = "旅行記を作成しました!!" 102 redirect_to("/posts/index") 103 else 104 render("posts/new") 105 end 106 107 end 108 109 def edit 110 @post = Post.find_by(id: params[:id]) 111 end 112 113 def update 114 @post = Post.find_by(id: params[:id]) 115 @post.content = params[:content] 116 if @post.save 117 flash[:notice] = "投稿を編集しました!" 118 redirect_to("/posts/index") 119 120 else 121 render("posts/edit") 122 end 123 124 end 125 126 def destroy 127 @post = Post.find_by(id: params[:id]) 128 @post.destroy 129 flash[:notice] = "投稿を削除しました!" 130 redirect_to("/posts/index") 131 end 132 133 def ensure_correct_user 134 @post = Post.find_by(id: params[:id]) 135 if @post.user_id != @current_user.id 136 flash[:notice] = "権限がありません" 137 redirect_to("/posts/index") 138 end 139 end 140 141end 142-------------------- 143index.html.erb-------- 144 145<div class="main posts-index"> 146 <div class="container"> 147 <% @posts.each do |post| %> 148 <div class="posts-index-item"> 149 <div class="post-left"> 150 <img src="<%= "/user_images/#{post.user.image_name}" %>"> 151 </div> 152 <div class="post-right"> 153 <div class="post-user-name"> 154 <%= link_to(post.user.name, "/users/#{post.user.id}") %> 155 </div> 156 <%= link_to(post.content, "/posts/#{post.id}") %> 157 </div> 158 </div> 159 <% end %> 160 </div> 161</div> 162------------------ 163show.html.erb---------------- 164 165<div class="main posts-show"> 166 <div class="container"> 167 <div class="posts-show-item"> 168 <div class="post-user-name"> 169 <img src="<%="/user_images/#{@user.image_name}"%>"> 170 <%= link_to(@user.name,"/users/#{@user.id}") %> 171 </div> 172 <p> 173 <%= @post.content %> 174 </p> 175 176 <div class="post-time"> 177 <%= @post.created_at %> 178 </div> 179 180 <div class="post-information"> 181 <%= @post.prefecture %> 182 <%= @post.category %> 183 <%= @post.with %> 184 </div> 185 186 <% if Like.find_by(user_id: @current_user.id,post_id: @post.id) %> 187 <%= link_to("/likes/#{@post.id}/destroy",{method:"post"}) do %> 188 <span class="fa fa-heart like-btn-unlike"></span> 189 <% end %> 190 <% else %> 191 <%= link_to("/likes/#{@post.id}/create",{method:"post"}) do %> 192 <span class="fa fa-heart like-btn"></span> 193 <% end %> 194 <% end %> 195 <%= @likes_count %> 196 197 <% if @user.id == @current_user.id %> 198 <div class="post-menus"> 199 <%= link_to("編集", "/posts/#{@post.id}/edit") %> 200 <%= link_to("削除", "/posts/#{@post.id}/destroy",{method:"post"}) %> 201 </div> 202 <% end %> 203 204 </div> 205</div> 206---------------- 207
試したこと
データベースに問題があるのかと思い、rails db:drop → rails db:migrate
を実行しましたがエラーは変わりませんでした。
また、エラー箇所をコメントにしたところ一つ下の行でほぼ同内容のエラーが表示されました。
載せた情報が不十分でしたら申し訳ございません。コメントを頂ければ更に載せます。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/18 12:44