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

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

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

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

Q&A

解決済

1回答

433閲覧

簡易掲示板作成にてtopicにコメントが入力できない

doichek

総合スコア27

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/11 08:09

前提・実現したいこと

簡易掲示板を作成しています。
topicにコメントを入力して送信ボタンを押すとエラーが表示されます。

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

エラーメッセージ
NoMethodError in MicropostsController#create
undefined method `microposts' for nil:NilClass

該当のソースコード(抜粋)

class MicropostsController < ApplicationController before_action :require_user_logged_in #current_user before_action :correct_user, only: [:destroy] def show @topic = Topic.find_by(id: params[:id]) @micropost = @topic.microposts.build #form_with用 @microposts = @topic.microposts.order(id: :desc).page(params[:page]) end def create @micropost = @topic.microposts.build(micropost_params) ※ if @micropost.save flash[:success] = 'メッセージを投稿しました。' redirect_to root_url else @microposts = current_user.microposts.order(id: :desc).page(params[:page]) flash.now[:danger] = 'メッセージの投稿に失敗しました。' render 'toppages/index' end end

試したこと

※行の「@topic」というクラスが存在しないというエラーだと思いましたので、
インスタンス変数を用意し、インスタンスメソッドが利用できるようにしました。※行の上に以下を追加。

@topic = Topic.new

これでエラーはなくなってmicropostsテーブルにレコードも追加できましたが、
micropostsテーブルのtopic_idカラムがnilとなっています。
そのため。topic画面にコメントが表示されない状態です。
topic_idカラムに現在アクセスしているtopicのidを入れたい場合どのようにコードを書けばよいかわかりません。

以下DB構造です
![イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

@topic = Topic.find_by(id: params[:id])

※の上のとこに追加する行をこうしてみてください

投稿2020/11/11 09:02

hukurouo

総合スコア108

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

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

doichek

2020/11/11 09:38 編集

回答ありがとうございます。 試してみましたが、さっきと同じエラーがでてしまいます。 NoMethodError in MicropostsController#create undefined method `microposts' for nil:NilClass params[:id]が空っぽでレコードが見つからず、@topicのインスタンス変数が作成できなかったようです。
hukurouo

2020/11/11 09:58

MicropostsController#createが呼び出される時のパラメータってどんな値が入っていますかね? エラー画面に表示されると思うんですが
doichek

2020/11/11 10:12

以下エラー画面のParameters項目をコピーしたものになります。 Parameters: {"utf8"=>"✓", "authenticity_token"=>"xNnlKnHXqqn/uAVjMl4IcgSxhSlJArOgepTzf1RIkMWf45UY0AX+WvPbZ/Asy+/NcBp6oZjxXohF0jThMwt+VQ==", "micropost"=>{"content"=>"bababa"}, "commit"=>"Post"}
doichek

2020/11/12 10:06 編集

ありがとうございます。参考先を確認し、以下の処理を追加したところ解決しました。 一昨日から悩んでいたので解決して本当に嬉しいです。ありがとうございました。 フォームに以下の行を追加。 <%= f.hidden_field :topic_id, :value => @micropost.topic_id %> そしてMicropostsController#createに以下の行を追加。 @topic = Topic.find_by(id: params[:micropost][:topic_id])
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問