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

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

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

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

Q&A

解決済

1回答

439閲覧

アソシエーションを利用してusernameを取得したい

chocolate24

総合スコア125

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/17 10:39

前提・実現したいこと

Ruby on railsでブログアプリ実装中です。
モデルはブログの内容とユーザーのIDが入ったTweetとユーザー情報が入ったUserがあります。
今回、tweet/indexでブログを表示する際にユーザー名(Userの中)を記事と結びつけて表示したいです。

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

イメージ説明

該当のソースコード

tweetsコントローラー

ruby

1class TweetsController < ApplicationController 2 before_action :move_to_index,except: [:index,:show] 3 4 def index 5 @tweets= Tweet.includes(:user).order(id: "DESC") 6 end 7省略 8 private 9 def tweet_params 10 params.require(:tweet).permit(:text,:title) 11 end 12 13 def move_to_index 14 redirect_to action: :index unless user_signed_in? 15 end 16end

index.html.erb

ruby

1<% if user_signed_in? %> 2 <%= current_user.username %>さんこんにちは 3<% end %> 4<div class="sample14"></div> 5<% @tweets.each do|tweet|%> 6 <h2><%= tweet.title %></h2> 7 <%= tweet.user.username %> #ここにエラーがでます 8 <p><%= tweet.text %></p> 9 <%= date_format(tweet.created_at) %> 10 <% if user_signed_in? %> 11 <% if current_user.id == tweet.user_id %> 12 <%= link_to 'edit', "/tweets/#{tweet.id}/edit", method: :get %> 13 <% end %> 14 <% end %> 15 <%= link_to "datils","/tweets/#{tweet.id}",method: :get%> 16 <% if user_signed_in? %> 17 <div class="good_button"> 18 <%=link_to image_tag("p1.jpeg"), "/" ,method: :get %> 19 </div> 20 21 <% end %> 22 <div class="sample14"></div> 23<% end %>

アソシエーション

ruby

1class Tweet < ApplicationRecord 2 belongs_to :user 3end

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 7 has_many :tweets, dependent: :destroy 8end

試したこと

コントローラー内でTweet.params[:id]で変数を定義し、インスタンス変数を作ってみた

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

Ruby on Rails 5.2.1

よろしくお願いします????

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

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

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

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

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

siruku6

2020/04/18 04:35

表示しようとしているtweetと結びついているuserがいない(nilになっている)ようです。 ためしに、tweet.user.username の部分を tweet.user や tweet.user_id に変えてみると何が表示されますか?
chocolate24

2020/04/18 04:43

ご指摘ありがとうございます!試してみます。
chocolate24

2020/04/18 05:03

tweet.userだと#<User:0x00007fe680145ac8>というようにハッシュが出てきます。またtweet.user_idは正常に表示されました。
siruku6

2020/04/18 05:22 編集

tweetは何件登録されていますか? 登録されているtweetのうちのどれか一つでも user がない場合、質問に掲載されているようなエラーになるので、全てのtweetがもれなくuserと結びついているかどうか確認する必要があります。 ちなみに、undefined method username for nil:NilClass というのは、「nil.usernameが実行されたが、nilにはusernameというメソッドはない」という意味になります。。。
chocolate24

2020/04/18 06:43

siruku6様 いったんtweetのデータを全て削除し、再度データがuserに結びつくようにしたところ、正常に表示されました。ありがとうございました。
guest

回答1

0

自己解決

自己解決ではないのですがsiruku6様のコメントにより、正常に動きました。原因としては、一部のツイートがuserと結びついていなかったことです。これからは、データベースも参照しながらエラーを素早く解決していきたいと思いました。

投稿2020/04/18 06:47

chocolate24

総合スコア125

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

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

siruku6

2020/04/18 07:43 編集

無事解決してよかったです! エラーメッセージが説明しようとしていることを詳細に読み取っていけば、それだけで原因がわかることがかなり多いので、これからも頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問