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

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

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

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

Q&A

解決済

2回答

417閲覧

簡易掲示板作成にて、最新投稿日時を表示させたい

doichek

総合スコア27

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/15 21:37

編集2020/11/15 23:16

前提・実現したいこと

簡易掲示板作成しています。
トピック一覧画面があり、各トピックにコメントの最新投稿日時を表示させたいです。

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

トピック一覧画面にアクセスすると以下のエラーが表示されます。

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')

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

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

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

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

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

m.ts10806

2020/11/15 22:27

このコードだけではなんとも言えないのでは。 ルーティング、コントローラ 含めて全てご提示ください。
m.ts10806

2020/11/16 01:37 編集

デバッグはされたのでしょうか?
m.ts10806

2020/11/16 01:40

1点謎の実装はあります。 ループ内のカウンタで得たオブジェクトからlastって使えるんでしょうか。 全てのデータが入ったオブジェクトからなら分かりますが、ループ内なので既に1レコードに絞られてるはずです。
doichek

2020/11/16 08:24

ご返答ありがとうございます。デバッグですが試しに @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 %> 他に必要とされる情報があればご提示いたします。
doichek

2020/11/16 09:53

本件、解決したため、クローズします。 ご返答ありがとうございました。
guest

回答2

0

ベストアンサー

おそらく、一つもmicropostがないtopicが有るのでしょう
topic.microposts.last&.created_at&.strftime()

投稿2020/11/16 07:21

winterboum

総合スコア23567

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

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

doichek

2020/11/16 09:50

回答ありがとうございます。 確かに一つもmicropostがないtopicがありました..!(完全に盲点でした) 該当のソースコードに修正して、無事解決できました。 ありがとうございました。
guest

0

モデルで関連付けの設定が必要だと思います。
topic.rb
has_many :microposts, dependent: :destroy

micropost.rb
belongs_to :topic

投稿2020/11/16 07:37

Toshi-6543

総合スコア19

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

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

doichek

2020/11/16 09:53

回答ありがとうございます。無事解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問