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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

3684閲覧

Rails コメント機能の実装でpost_id :nil が解決できない

salmon_trout

総合スコア7

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2019/08/23 06:17

前提・実現したいこと

Rails コメント機能の実装中です。
新着投稿画面から、詳細画面に飛び、そこでコメントと、コメント一覧の表示をさせたいです。
コメントまではできるのですが、コメント一覧がカラの配列になっていました。
そこDB検索をしたところ、post_id :nilとなっており、ここが問題であると考えています。

この問題がわかる方、教えていただきたいです。

該当のソースコード

postコントローラ show.html.erb

<P>投稿詳細ページ</P> <h3><%= @post.title%></h3> <h3><%= @post.content%></h3> <h2>コメント一覧</h2> <%= @comments.each do |c| %> <div> <%= @post.user.id %> <%= c.user.email %> <%= c.comment %> </div> <% end %> <%= form_with(model: [@post, @comment], local: true) do |f| %> <%= f.text_field :comment %> <%= f.submit "コメントする", class: "btn btn-primary" %> <% end %> <%= link_to "ホームへ戻る", posts_path %>
class CommentsController < ApplicationController def create @comment = Comment.new (comment_params) @comment.user_id = current_user.id if @comment.save redirect_back(fallback_location: root_path) else redirect_back(fallback_location: root_path) end end end private def comment_params params.require(:comment).permit(:comment) end
class PostsController < ApplicationController def index @search = Post.search(params[:q]) @post = @search.result @posts = Post.order(id: :desc).page(params[:page]).per(10) end def show @post = Post.find(params[:id]) @comments = @post.comments @comment = Comment.new end
[#<Comment id: 1, comment: "ありがとう", user_id: 14, post_id: nil, created_at: "2019-08-23 05:01:02", updated_at: "2019-08-23 05:01:02">

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

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

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

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

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

guest

回答4

0

class CommentsController < ApplicationController def create @post = Post.find(params[:post_id]) @comment = @post.comments.new (comment_params) # 略 end end

上記のように、変更したところ、解決することができました。

解決のために相談に乗っていただいた、3名の方、親切かつ丁寧に教えていただき、ありがとうございました。

3名様とも、ベストアンサーにしたいのは山々ですが、問題解決に直結したlghrs様にさせていただきます。

ありがとうございました。

投稿2019/08/23 10:31

salmon_trout

総合スコア7

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

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

0

ベストアンサー

form_with(model: [@post, @comment] と2つのモデルを与えているのでURLは POST posts/:post_id/commentsのようなURLでコメントが登録されるよいうことで良いでしょうか?
その場合 comment_params に含めるのではなく URL から取得すべきだと思います

ruby

1class CommentsController < ApplicationController 2 def create 3 @post = Post.find(params[:post_id]) 4 @comment = @post.comments.new (comment_params) 5 # 略 6 end 7end

またエラーとは関係ないかもですが、 show の新規登録用の @comment もアソシエーション経由で new すれば post_id が入ったインスタンスが作られます

ruby

1class PostsController < ApplicationController 2 def show 3 @post = Post.find(params[:id]) 4 @comments = @post.comments 5 @comment = @post.comments.new 6 end 7end

投稿2019/08/23 09:07

Ighrs

総合スコア656

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

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

salmon_trout

2019/08/23 09:36

回答ありがとうございます! 上記のソースに変更させていただき、 Show.html.erbにて実行したところ、 <%= @post.comments.each do |c| %> <div> <%= c.comment %> </div> <% end %> 上記のコードが次はこのような表示になってしまいました。。。 [#<Comment id: nil, comment: nil, user_id: nil, post_id: 26, created_at: nil, updated_at: nil>] パスはおっしゃっていただいた通りのパスでした。 post_comments POST /posts/:post_id/comments(.:format) comments#create 原因はどのようなことが考えられるでしょうか?
guest

0

erb

1<%= @post.comments.each do |c| %>

rb

1class CommentsController < ApplicationController 2 def create 3 @comment = Post.find(post_id).comments.new(comment_params)

Active Record の関連付け

投稿2019/08/23 08:43

Mugheart

総合スコア2342

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

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

salmon_trout

2019/08/23 09:03 編集

回答ありがとうございます! アドバイス通り、実践させていただきましたところ、 undefined local variable or method `post_id' for #<CommentsController:0x00007f3b0566d248> Did you mean? post_url とエラーが出てしまいました。 自分が勉強不足なので、この意味もよくわかりません。 何が原因か教えていただけないでしょうか?
winterboum

2019/08/23 09:05

モデル Comment に post_id が作ってないのでは? migration か schema.rb見せて下さい
salmon_trout

2019/08/23 09:08

schema.rb ``` ActiveRecord::Schema.define(version: 2019_08_23_072757) do create_table "comments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "comment" t.integer "user_id" t.integer "post_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "favorites", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.integer "user_id" t.integer "tweet_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "posts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.text "title" t.text "content" t.integer "user_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "name" t.string "email" t.string "password_digest" t.datetime "created_at", null: false t.datetime "updated_at", null: false end end ``` モデルComment ``` class CreateComments < ActiveRecord::Migration[5.2] def change create_table :comments do |t| t.string :comment t.integer :user_id t.integer :post_id t.timestamps end end end ``` こちらです!
Mugheart

2019/08/23 09:11

post_id は ここに post レコードの id が入りますよくらいの意味で書いたのでコピペしてもダメです。 Ighrs さんも書いてますが params[:post_id] とかになるんですかね?
salmon_trout

2019/08/23 09:36

私の勉強不足で、せっかくの回答の意図が理解できず、申し訳ございません。。。
guest

0

create に渡ったparamsに post.idが有るのではないかと思うのですが、とりあえず

<%= f.text_field :comment %>
に並べて
<%= f.hidden_field :post_id,@post.id %>
を置いてみて下さい

投稿2019/08/23 08:12

winterboum

総合スコア23324

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

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

salmon_trout

2019/08/23 08:37

ご回答ありがとうございます! アドバイス通りソースを追加させていただきましたが、NoMethodErrorということでエラーが出てしまいました。。。 <%= @comments.each do |c| %> <div> <%= c.comment %> </div> <% end %> コメント投稿までできるのですが、each文での表示がされないんですよね、、、、
winterboum

2019/08/23 09:03

NoMethodError の全文と、該当する行がどれなのかおしえて下さい
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問