🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1509閲覧

Rails モデルで定義したインスタンスメソッドを利用して、投稿に紐づいたユーザ情報をviewに表示させたい。

Ayaka_2020

総合スコア6

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/01/02 05:33

編集2020/01/02 06:18

前提・実現したいこと

プログラミング学習3ヶ月目の初心者です。
とても基本的なエラー内容かもしれませんが、ご回答いただけますと幸いです。

現在、自身のポートフォリオとして、Ruby on Railsを使用し、
「就活マッチングサービス」を作成中です。
表題の通りですが、求職者のアピール一覧(つぶやき一覧のようなもの)に、
投稿した本人のアイコン画像や、ニックネームなどをviewに表示させたい中で、
以下のエラーメッセージが発生しました。

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

▼localhost:3000のブラウザ上にて(こちらの16番目のラインにてエラー発生)

NoMethodError in Posts#index undefined method `image_name' for nil:NilClass Extracted source (around line #16): 14<div class="time_line_body_header"> 15 <div class="user_time_line_image"> 16 <img src="<%= "/user_icon_images/#{post.user.image_name}" %>"> 17 </div> 18 <div class="user_name"> 19 <%= link_to(post.user.nickname, "#") %>

▼ページアクセス時のターミナル上にて

ActionView::Template::Error (undefined method `image_name' for nil:NilClass): 13: <div class="time_line_body"> 14: <div class="time_line_body_header"> 15: <div class="user_time_line_image"> 16: <img src="<%= "/user_icon_images/#{post.user.image_name}" %>"> 17: </div> 18: <div class="user_name"> 19: <%= link_to(post.user.nickname, "#") %> app/views/posts/index.html.erb:16:in `block in _app_views_posts_index_html_erb__4186843746045429960_70347610308620' app/views/posts/index.html.erb:12:in `_app_views_posts_index_html_erb__4186843746045429960_70347610308620'

該当のソースコード

views/posts/index.html.erb

ruby

1<div class="time_line"> 2 <% @user_posts.each do |post| %> 3 <div class="time_line_body"> 4 <div class="time_line_body_header"> 5 <div class="user_time_line_image"> 6 <img src="<%= "/user_icon_images/#{post.user.image_name}" %>"> 7 </div> 8 <div class="user_name"> 9 <%= link_to(post.user.nickname, "#") %> 10 </div> 11 </div> 12~~~~~~~~~~~以下にはアピール内容(呟き内容)などのソースがある~~~~~~~~~~~~

models/post.rb

ruby

1class Post < ApplicationRecord 2 validates :user_id, {presence: true} 3 4 def user 5 return User.find_by(id: self.user_id) 6 end 7end

controllers/posts_controller.rb

ruby

1class PostsController < ApplicationController 2 def index 3 @user_posts = Post.all.order(created_at: :desc) 4 end

ソースを見ていただいた様に、
モデルにインスタンスメソッドを定義し、それをviewのhtmlで、postに対して呼び出したいのですが、なかなかうまく行きません。。

試したこと

・railsサーバの再起動
・usersテーブル上に、確実にimage_nameカラム、nicknameカラムがあるか確認
・postsテーブル上に、確実にuser_idカラムがあるか確認
・rails bd:migrateでデータベースを再度保存
・ログイン中アカウントのuser_idや、image_nameなど、
postsテーブルカラム、usersテーブルカラムのそれぞれのデータの格納漏れがないか確認。

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

OS:macOS 10.15.2

Ruby ver: 2.5.0p0
Rails ver: 5.2.4.1

エディタ:Sublime Text

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

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

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

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

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

winterboum

2020/01/02 05:38

エラーメッセージは省略しないで全部載せてください。他の行にも解析に必要な情報がありますから。
Ayaka_2020

2020/01/02 06:29

エラーメッセージを全て記載いたしました!
guest

回答1

0

ベストアンサー

エラーメッセージが省略されてしまっているので、推定で書くことになります
<img src="<%= "/user_icon_images/#{post.user.image_name}" %>">
エラーが出ているのはここでしょうか?
とすると、
User.find_by(id: self.user_id)
で該当するUserが見つからなかったために post.user がnilになってこのエラーとなっています。
そこ確認してみてください。

なお、こういう場合は

class Post < ApplicationRecord belongs_to :user

とすると

validates :user_id, {presence: true} def user return User.find_by(id: self.user_id) end

の宣言が不要になり、かつ存在しない user_idとするとエラーになるので、動きが確実になります

投稿2020/01/02 05:46

winterboum

総合スコア23567

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

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

Ayaka_2020

2020/01/02 06:38

早速のご回答、本当に有難うございます! おっしゃる通りで、記載いただいた箇所でエラーが発生しています。 >User.find_by(id: self.user_id) で該当するUserが見つからなかったために post.user がnilになってこのエラーとなっています。 そこ確認してみてください。 確認いたしましたが、該当するユーザーも、そのuser_idを持つ投稿も存在します。。 >belongs_to :userを使えば、存在しないuser_idとするとエラーになるので、動きが確実になります。 こちらも、belongs_to :userに変更し、htmlソースなどはそのままにして、再度試しましたが、解決せずでした。。
winterboum

2020/01/02 06:51 編集

はて、、、 全てのpostのuser_idが有効(そのidをもつuserがある)ですか? 一つでも存在しないuser_idがあるとそこでエラーになります。 belongs_to :user にしても、そのままでは効果が無いです。 saveするときにチェックがかかるので、既存のデータでは。 エラーの出ているpostを編集し直すしてもエラーにはならな?
Ayaka_2020

2020/01/02 08:13

>全てのpostのuser_idが有効(そのidをもつuserがある)ですか? 一つでも存在しないuser_idがあるとそこでエラーになります。 ずばり、これでした!! user_idがnilのものが存在しており、それをdestroyしたら、解決しました。 ご丁寧に教えていただき、本当に有難うございます! belongs_toについても、自分でもっと調べて、理解を深めてみます♪
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問