前提・実現したいこと
Progate Rails Ⅸのコードを自分の仮想環境で書いてました。
Twitterのようなwebアプリ作成中で
投稿一覧(index.html.erb)にユーザーの画像を表示しようとしたらエラー発生。
発生している問題・エラーメッセージ
NoMethodError in Posts#index Showing /vagrant/new_app/app/views/posts/index.html.erb where line #6 raised: undefined method `image_name' for nil:NilClass Extracted source (around line #6): 4 <div class="posts-index-item"> 5 <div class="post-left"> 6 <img src="<%= "/post.user_images/#{post.user.image_name}" %>"> 7 </div> 8 <div class="post-right"> 9 <div class="post-user-name"> Rails.root: /vagrant/new_app Application Trace | Framework Trace | Full Trace app/views/posts/index.html.erb:6:in `block in _app_views_posts_index_html_erb___226630752__647422898' app/views/posts/index.html.erb:3:in `_app_views_posts_index_html_erb___226630752__647422898' Request Parameters: None Toggle session dump Toggle env dump Response Headers: None
該当のソースコード(routes.rb)
Ruby
1Rails.application.routes.draw do 2 get "login" => "users#login_form" 3 post "login" => "users#login" 4 post "logout" => "users#logout" 5 6 post "users/:id/update" => "users#update" 7 get "users/:id/edit" => "users#edit" 8 post "users/create" => "users#create" 9 get "users/index" => "users#index" 10 get "signup" => "users#new" 11 get "users/:id" => "users#show" 12 13 get "posts/new" => "posts#new" 14 get "posts/index" => "posts#index" 15 get "posts/:id" => "posts#show" 16 post "posts/create" => "posts#create" 17 get "posts/:id/edit" => "posts#edit" 18 post "posts/:id/update" => "posts#update" 19 post "posts/:id/destroy" => "posts#destroy" 20 21 get "/" => "home#top" 22 get "about" => "home#about" 23end
該当のソースコード(posts_controller.rb)
Ruby
1class PostsController < ApplicationController 2 3 before_action :authenticate_user 4 5 def index 6 @posts = Post.all.order(created_at: :desc) 7 end 8 9 def show 10 @post = Post.find_by(id: params[:id]) 11 @user = @post.user 12 end 13 14 def new 15 @post = Post.new 16 end 17 18 def create 19 @post = Post.new( 20 content: params[:content], 21 user_id: @current_user.id 22 ) 23 if @post.save 24 flash[:notice] ="投稿を作成しました" 25 redirect_to("/posts/index") 26 else 27 render("/posts/new") 28 end 29 end 30 31 def edit 32 @post = Post.find_by(id: params[:id]) 33 end 34 35 def update 36 @post = Post.find_by(id: params[:id]) 37 @post.content = params[:content] 38 if @post.save 39 flash[:notice] = "投稿を編集しました" 40 redirect_to("/posts/index") 41 else 42 render("/posts/edit") 43 end 44 end 45 46 def destroy 47 @post = Post.find_by(id: params[:id]) 48 @post.destroy 49 flash[:notice] ="投稿を削除しました" 50 redirect_to("/posts/index") 51 end 52 53end
該当のソースコード(index.html.erb)
HTML
1<div class="main posts-index"> 2 <div class="container"> 3 <% @posts.each do |post| %> 4 <div class="posts-index-item"> 5 <div class="post-left"> 6 <img src="<%= "/post.user_images/#{post.user.image_name}" %>"> 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 <%= link_to(post.content, "/posts/#{post.id}") %> 13 </div> 14 </div> 15 <% end %> 16 </div> 17</div>
該当のソースコード(show.html.erb)
HTML
1<div class="main posts-show"> 2 <div class="container"> 3 <div class="posts-show-item"> 4 <div class="post-user-name"> 5 <img src="<%= "/user_images/#{@user.image_name}" %>"> 6 <%= link_to(@user.name, "/users/#{@user.id}") %> 7 </div> 8 <p> 9 <%= @post.content %> 10 </p> 11 <div class="post-time"> 12 <%= @post.created_at %> 13 </div> 14 <div class="post-menus"> 15 <%= link_to("編集", "/posts/#{@post.id}/edit") %> 16 <%= link_to("削除", "/posts/#{@post.id}/destroy",{method: "post"}) %> 17 </div> 18 </div> 19 </div> 20</div>
該当のソースコード(user.rb)
Ruby
1class User < ApplicationRecord 2 validates :name,{presence: true} 3 validates :email, {presence: true, uniqueness: true} 4 validates :password, {presence: true} 5end
該当のソースコード(post.rb)
Ruby
1class Post < ApplicationRecord 2 validates :content, {presence: true, length: {maximum: 140}} 3 validates :user_id, {presence: true} 4 5 def user 6 return User.find_by(id: self.user_id) 7 end 8 9end
試したこと
投稿の詳細画面を表示しようとしたところそれでもメソッドエラーが出たので
ビュー以外にミスがあるのかと思いました。
回答2件
あなたの回答
tips
プレビュー