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

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

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

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails 5

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

Ruby

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

Q&A

解決済

1回答

748閲覧

undefined method `photos' for nil:NilClassのエラーを解決したいです。

ckr

総合スコア23

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2020/03/16 23:36

編集2020/03/17 00:17

前提・実現したいこと

Rails5.2 を用いた画像投稿サービスを作成しています。(Instagramのようなものです)
ユーザーが画像を投稿し、投稿した画像の詳細画面に飛ぼうとすると、以下のエラーメッセージが発生しました。

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

undefined method `photos' for nil:NilClass
イメージ説明
<%= image_tag @post.photos.first.image.url(:medium), class: "card-img-top" %>という
コードがnilクラスになってしまっているようです。

該当のソースコード


★エラー文
Extracted source (around line #6):

<div class="col-md-8"> <div class="card-left"> <%= image_tag @post.photos.first.image.url(:medium), class: "card-img-top" %> </div> <div class="col-md-4"> <div class="card-right"> ------------------------ ★postコントローラ class PostsController < ApplicationController before_action :authenticate_user! before_action :set_post, only: %i(show destroy)

def new
@post = Post.new
@post.photos.build
end

def create
@post = Post.new(post_params)
if @post.photos.present?
@post.save
redirect_to "/posts/:id"
flash[:notice] = "投稿が保存されました"
else
redirect_to root_path
flash[:alert] = "投稿に失敗しました"
end
end

def index
@posts = Post.all.includes(:photos, :user).order('created_at DESC')
end

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

def destroy
if @post.user == current_user
flash[:notice] = "投稿が削除されました" if @post.destroy
else
flash[:alert] = "投稿の削除に失敗しました"
end
redirect_to root_path
end

private
def post_params
params.require(:post).permit(:caption, photos_attributes: [:image]).merge(user_id: current_user.id)
end

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

end

試したこと

rails consoleを用いて、【Post】と【Photo】の中身を調べましたが、
レコードは存在していました。

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

開発環境:cloud9
MacBook air
Rails 5.2.4.1
ruby 2.6.3p62

おいそがしいところ大変恐れ入りますが、
何卒宜しくお願い致します。

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

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

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

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

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

maisumakun

2020/03/16 23:44

URLが/users/1となっていますが、これが呼び出す先はPostsControllerで正しいのでしょうか。
ckr

2020/03/17 00:16

大変申し訳ございません。エラーのスクリーンショットの内容が誤っておりましたので修正致します。 posts/:idでエラーとなっています。
guest

回答1

0

ベストアンサー

rails consoleを用いて、【Post】と【Photo】の中身を調べましたが、

レコードは存在していました。

本当ですか?

/posts/:idというURLにアクセスしている以上、データベースの検索はPost.find_by(id: ':id')として行われます。id値に文字列を使うという特殊な設計にしていない限り、何もヒットしないかと思います。

投稿2020/03/17 00:23

maisumakun

総合スコア146018

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

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

ckr

2020/03/17 00:57

解答ありがとうございます。 ということは、私のコードの @post = Post.find_by(id: params[:id]) を変更する必要があるという認識で宜しいでしょうか。 本日勤務終了後、コンソールのデータもアップいたします。 恐れいりますが、引き続き宜しくお願い致します。
maisumakun

2020/03/17 01:00

> @post = Post.find_by(id: params[:id]) を変更する必要があるという認識で宜しいでしょうか。 いえ、違います。/posts/:idではなく、/posts/1のような、正しいID付きのURLでアクセスしないといけない、ということです。
ckr

2020/03/17 07:55

ご回答ありがとうございます。 posts/1にGETリクエストを送るとposts/showが表示されるようにルーティングを修正すらばよろしいでしょうか。 度々のご質問、大変申し訳ございません。
maisumakun

2020/03/17 08:03

> posts/1にGETリクエストを送るとposts/showが表示されるようにルーティングを修正すらばよろしいでしょうか。 すでにそうなっています。アクセスするURLが間違っているだけです。
maisumakun

2020/03/17 08:06

(画像のURL欄をご確認ください。本当に/posts/:idというURLになっています)
ckr

2020/03/17 08:54

迅速なご返信ありがとうございます。 アクセスするURLが間違っているということで、link_toに渡しているURLのパスが間違っているのかもしれません。 早急に確認させて頂きます。
ckr

2020/03/18 07:01

(画像のURL欄をご確認ください。本当に/posts/:idというURLになっています) →こちら、redirect_toのパスが異なるためのエラーでした。/postsとすべきところを、/posts/:idにしておりました。 ご指摘いただき、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問