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

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

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

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

Q&A

1回答

1499閲覧

undefined method `image_name' for nil:NilClass といエラーがでています

SatoYuka

総合スコア8

Ruby on Rails 5

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

0グッド

0クリップ

投稿2018/03/15 11:42

編集2018/03/16 03:53

前提・実現したいこと

postとuserのuser_idの関連付けがうまくできずにいます。
progateのRuby on Rails5 学習コース Ⅸ 「 新規投稿をログインユーザーに紐付けよう」 のところで、投稿一覧にユーザー情報を表示ができずindex.html.erb でundefined method `image_name' for nil:NilClassというエラーが発生しています。

postのuser_idは存在しているのですが、それに紐づいているはずのuser_idがnilとなっており、postに対しuser_idがうまく紐づいてくれません。また、postでuser_idを保存しようとしても保存できず、falseが返ってきます。
以下のpost.rbとuser.erbのコードでは関連づけられていないのでしょうか?

発生している問題・エラーメッセージ```NoMethodError in Posts#indexundefined method `image_name' for nil:NilClass

エラーメッセージ
```undefined method `image_name' for nil:NilClass

該当のソースコード

---post.rb---
class Post < ApplicationRecord
validates :content, {presence: true, length: {maximum: 140}}
validates :user_id, {presence: true}

belongs_to :user

end
---user.erb----
class User < ApplicationRecord
validates :name, {presence: true}
validates :email, {presence: true, uniqueness: true}
validates :password, {presence: true}

has_many :posts
end
---posts/index.html----

<div class="main posts-index"> <div class="container"> <% @posts.each do |post| %> <div class="posts-index-item"> <div class="post-left"> <img src="<%= "/user_images/#{post.user.image_name}" %>"> </div> <div class="post-right"> <div class="post-user-name"> <%= link_to(post.user.name, "/users/#{post.user.id}") %> </div> <%= link_to(post.content, "/posts/#{post.id}") %> </div> </div> <% end %> </div> </div> ソースコード ---posts_controller.erb---- class PostsController < ApplicationController before_action :authenticate_user

def index
@posts = Post.all.order(created_at: :desc)
end

def show
@post = Post.find_by(id: params[:id])
@user = @post.user
end

def new
@post = Post.new
end
def create
@post = Post.new(
content: params[:content],
user_id: @current_user.id
)

if @post.save flash[:notice] = "投稿を作成しました" redirect_to("/posts/index") else render("posts/new") end

end

def edit
@post = Post.find_by(id: params[:id])
end

def update
@post = Post.find_by(id: params[:id])
@post.content = params[:content]
if @post.save
flash[:notice] = "投稿を編集しました"
redirect_to("/posts/index")
else
render("posts/edit")
end
end

def destroy
@post = Post.find_by(id: params[:id])
@post.destroy
flash[:notice] = "投稿を削除しました"
redirect_to("/posts/index")
end

コード ### 試したこと```ここに言語を入力 コード ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

コードは正しいはずなのに post.usernil であるとき,原因の一つとして考えられるのは,開発の中途段階で,posts テーブルに user_id が空のレコードができちゃってることです。
現在のコードではそういうレコードはできないはずなんだけど,コードがそうなる前にできちゃったレコードってことですね。

ただ,

また、postでuser_idを保存しようとしても保存できず、falseが返ってきます。

とあるので,現在のコントローラーのコードが正しくない可能性が高いと思います。
そこのコードを見せてください。

Rails のバージョンはいくつですか。Rails 5 以降の場合,

rb

1belongs_to :user

の記述では,user_id を空(nil)にするのは許されないはずなんですが。

投稿2018/03/15 14:19

編集2018/03/15 14:19
scivola

総合スコア2108

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

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

SatoYuka

2018/03/15 14:38

回答いただきありがとうございます。 バージョンはRails 5.1.5でした。 Userのuser_idはカラ(nil)にはならないので、Postテーブルを作った時にuser_idがカラの物を作ってしまったということになるのでしょうか。 そうした場合は、Postテーブルのuser_idだけ作り直すことが必要になってくるのでしょうか? postsコントローラーのソースを追加いたしましたので、お手数ですがご確認いただけたら幸いです。
scivola

2018/03/15 14:56

ソースコードの提示で,インデントを無くされると読みづらいです。 「Userのuser_idはカラ(nil)にはならないので」とありますが,User モデルにも user_id ってカラムがあるのですか???
SatoYuka

2018/03/16 03:59

インデントがうまく表示できなかったです。 User にはidでした。すみません間違えました。
scivola

2018/03/21 08:13

だいぶ時間が空いてしまいました。 やはり現在のコードで,`user_id` が `nil` の `Post` はできそうな気がしないですね。 今データベースに入っているデータを捨ててよければ,いったん rails db:drop でデータベースを無くして,改めて rails db:migrate してもう一度やってみては。 たぶん,こんどは index で同じエラーは出ないと思います。 それで,もし Post を投稿するときにエラーが出るようならそのエラーを見せてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問