前提・実現したいこと
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
よろしくお願いします????
表示しようとしているtweetと結びついているuserがいない(nilになっている)ようです。
ためしに、tweet.user.username の部分を tweet.user や tweet.user_id に変えてみると何が表示されますか?
ご指摘ありがとうございます!試してみます。
tweet.userだと#<User:0x00007fe680145ac8>というようにハッシュが出てきます。またtweet.user_idは正常に表示されました。
tweetは何件登録されていますか?
登録されているtweetのうちのどれか一つでも user がない場合、質問に掲載されているようなエラーになるので、全てのtweetがもれなくuserと結びついているかどうか確認する必要があります。
ちなみに、undefined method username for nil:NilClass というのは、「nil.usernameが実行されたが、nilにはusernameというメソッドはない」という意味になります。。。
siruku6様
いったんtweetのデータを全て削除し、再度データがuserに結びつくようにしたところ、正常に表示されました。ありがとうございました。
回答1件
あなたの回答
tips
プレビュー