前提・実現したいこと
簡易掲示板作成しています。
トピック一覧画面があり、各トピックにコメントの最新投稿日時を表示させたいです。
発生している問題・エラーメッセージ
トピック一覧画面にアクセスすると以下のエラーが表示されます。
NoMethodError in Topics#index
undefined method `created_at' for nil:NilClass
該当のルーティング
Rails.application.routes.draw do <!--省略--> get 'search', to: 'topics#search' resources :topics, only: [:index, :create, :destroy] <!--省略--> end
##該当のコントローラ
class TopicsController < ApplicationController <!--省略--> def index if logged_in? @topic = current_user.topics.build # form_with 用 @topics = Topic.order(id: :desc).page(params[:page]) end end <!--省略--> end
該当のソースコード
<% @topics.each do |topic| %> <!--省略--> <span class="text-muted">最新投稿日時<%= topic.microposts.last.created_at.strftime('%Y/%m/%d%H%M')%></span> <!--省略--> <% end %>
試したこと
rails consoleで以下のコマンドを入力して、最新投稿日時が取得できたので文法は間違っていないことは確認できました。
@topic = Topic.find_by(id: 6) #仮でidが6のトピックを取得 @topic.microposts.last.created_at.strftime('%Y/%m/%d%H%M')
このコードだけではなんとも言えないのでは。
ルーティング、コントローラ 含めて全てご提示ください。
デバッグはされたのでしょうか?
1点謎の実装はあります。
ループ内のカウンタで得たオブジェクトからlastって使えるんでしょうか。
全てのデータが入ったオブジェクトからなら分かりますが、ループ内なので既に1レコードに絞られてるはずです。
ご返答ありがとうございます。デバッグですが試しに
@topic.microposts.last.created_at.strftime('%Y/%m/%d%H%M')
のところを
@topic.microposts.last
に変えた(削った)ところ
#<Micropost:0x00007f50196d9640>
という値が表示されました。
ループ内でtopicsは1レコードに絞られていると思いますがtopicsに紐づいているmicropostsは1レコードに絞られていない状態だと考えております。
試しにですが、以下のソースコードに変えてみても同じエラーが表示されました。
<% @microposts = Micropost.where(topic_id: topic.id) %>
<%= @microposts.last.created_at %>
他に必要とされる情報があればご提示いたします。
本件、解決したため、クローズします。
ご返答ありがとうございました。
回答2件
あなたの回答
tips
プレビュー