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

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

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

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

Ruby

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

HTML

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

Q&A

解決済

2回答

666閲覧

Railsでimageが表示出来ずエラーがでます

yaegashi0852

総合スコア13

Ruby on Rails 5

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

Ruby

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

HTML

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

0グッド

1クリップ

投稿2018/04/18 05:16

編集2018/04/18 06:38

前提・実現したいこと

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

試したこと

投稿の詳細画面を表示しようとしたところそれでもメソッドエラーが出たので
ビュー以外にミスがあるのかと思いました。

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

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

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

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

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

m.ts10806

2018/04/18 05:24

エラーメッセージもコードブロック ``` で囲ってください。また、「解答のコピー&ペースト」では「試したこと」にはなりません。出ているエラーに対して行った意味あるアプローチを行ってください。
yaegashi0852

2018/04/18 06:52

ご指摘ありがとうございます、以後改善していきます。
guest

回答2

0

自己解決

SQLite導入、migrateがされてなかった可能性がありました。

投稿2018/05/24 19:43

yaegashi0852

総合スコア13

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

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

0

本当なら、全く違う質問内容だったならば一旦クローズにして出し直すのが正しいと思います。

ちなみにエラーメッセージの内容はnilに対してimage_nameメソッドを呼び出そうとしているようです。
つまりpost内のuserにUserモデルのインスタンスが設定されていません。
そもそも現状のモデルの実装を見るとPostモデルとUserモデルと間にリレーションの設定がされていないように見えます。
ですのでpost内にuserが設定されるわけがありません。

モデルのリレーション設定を見直してみて下さい

投稿2018/04/18 05:35

編集2018/04/18 09:08
m0a

総合スコア708

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

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

yaegashi0852

2018/04/18 06:43

m0aさん 解答ありがとうございます。 指摘箇所なのですが私のミスで抜けていたところでした。 よってエラーメッセージも違うものでした。 Userモデル追加しましたのでよろしければご確認お願いいたします。
m0a

2018/04/19 05:37

解答を修正しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問