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

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

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

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

Q&A

解決済

1回答

1031閲覧

コメント機能がデータベースに反映しない

dokodoko

総合スコア20

Ruby on Rails

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

0グッド

0クリップ

投稿2020/01/14 17:43

PostsController

1class PostsController < ApplicationController 2 def index 3 4 @posts = Post.all 5 end 6 7 def new 8 @post = Post.new 9 end 10 11 def create 12 Post.create(post_params) 13 end 14 15 16 def edit 17 @post = Post.find(params[:id]) 18 end 19 20 def update 21 post = Post.find(params[:id]) 22 if post.user_id == current_user.id 23 post.update(post_params) 24 end 25 end 26 27 def show 28 @post = Post.find(params[:id]) 29 @comment = Comment.new 30 end 31 32 33 def destroy 34 post = Post.find(params[:id]) 35 if post.user_id == current_user.id 36 post.destroy 37 end 38 end 39 40 41 private 42 def post_params 43 params.require(:post).permit(:text).merge(user_id: current_user.id) 44 end 45end

postsindex

1<div class="contents_row"> 2 <% @posts.each do |post| %> 3 <li> 4 <%= link_to '削除', "/posts/#{post.id}", method: :delete %> 5 </li> 6 <li> 7 <%= link_to '編集', "/posts/#{post.id}/edit", method: :get %> 8 </li> 9 <li> 10 <%= link_to '詳細', "/posts/#{post.id}", method: :get %> 11 <li> 12 13 14 <%= simple_format(post.text) %> 15 <% end %> 16</div>

postsshow

1<div class="contents_row"> 2 3 4 <div> 5 <%= simple_format(@post.text) %> 6 </div> 7 8 <span class="name"> 9 <a href="/users/<%= @post.user.id %>"> 10 <span>投稿者</span><%= @post.user.name %> 11 </a> 12 </span> 13 14 15 <%= form_for [@post, @comment] do |f| %> 16 <%= f.text_field :text %> 17 <%= f.submit %> 18 <% end %> 19 20 21 22 23 24</div>

CommentsController

1class CommentsController < ApplicationController 2 def new 3 end 4 5 def create 6 Comment.create(text: comment_params[:text], post_id: comment_params[:post_id], user_id: current_user.id) 7 end 8 9 private 10 def comment_params 11 params.permit(:text, :post_id) 12 end 13end 14

詳細ページからコメントするためにコメントコントローラーでcreateしてもなぜか内容がデータベースにデータが保存されずに悩んでいます。
エラーは出ずにtextカラムがnullのまま送信されてしまっている状態です。
お力を貸していただけると助かります。
お手数ですがよろしくお願いします。

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

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

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

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

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

FKM

2020/01/15 01:43 編集

DBにおけるinsertとupdateの用法を混同してませんか? 既に作られたデータに新たにカラム内のデータを追加挿入する場合はupdateです。
shinoharat

2020/01/15 04:30

確認ですが、お悩みの内容は「DBにコメントが保存されない」であって「保存したコメントが画面に表示されない」ではないですよね? 質問に書いていただいているコードの中に、保存したコメントを表示するためのコードが無かったので、それが意図通りなのかどうか気になりました。
dokodoko

2020/01/15 07:09

回答ありがとうございます。返信遅れてすいません。 そのとおりです。dbにコメントが保存されない。nullになってしまう状況です。 現時点で表示するためのコードはかいていません。 すでに作られたカラムに記入したいというよりposts>show.html.erbのform_for部分からtextを送信してもなぜかtext部分だけnullになってしまう状況です。
shinoharat

2020/01/15 07:20

了解です。 回答欄にも書きましたが、CommentsController の comment_params の処理が怪しいかなと思います。 params の中身がどうなっているか、一度確認してみてください。 (comment_params ではなく、params の中身を確認する)
dokodoko

2020/01/15 07:39

返信ありがとうございます。 paramsの中身を確認させて頂きました。 "utf8"=>"✓", "authenticity_token"=>"==", "comment"=>{"text"=>"ccccc"}, "commit"=>"Create Comment", "controller"=>"comments", "action"=>"create", "post_id"=>"5"} permitted: false>
dokodoko

2020/01/15 07:40

ccccc部分が送信したtextになります。
guest

回答1

0

ベストアンサー

詳細ページからコメントするためにコメントコントローラーでcreateしてもなぜか内容がデータベースにデータが保存されずに悩んでいます。
エラーは出ずにtextカラムがnullのまま送信されてしまっている状態です。

CommentsController の create アクションの comment_params[:text] が nil になっていることは確認済みってことですかね?

怪しいのは CommentsController の comment_params の処理かなと思います。

この時点の params の内容って

{ "post_id" => 1, "comments" => { "text" => "コメントです" } }

みたいな感じにならないですっけ?

comment_params ではなく、params がどういう状態になっているか確認してみてください。

--

(追記ここから)

params の確認ありがとうございます。
原因が分かりました。

解説

まずは、params に含まれているはずの text が comment_params で取得出来なかった理由について説明したいと思います。

今の params の構造ですが、余分なデータを除くと以下のようになっています。
「comment の中の text に値が入っている」という点がポイントです。

{ "comment"=>{"text"=>"ccccc"}, "post_id"=>"5" }

一方、現在のコードでは、一番上の階層に text がある前提で permit されています。

rb

1 def comment_params 2 # ↓ 本当は「comment の中の text」を permit しないといけないです 3 params.permit(:text, :post_id) 4 end

params の直下に text というキーは存在しないため、当然値は nil になります。

修正方法

まずは comment_params を以下のように修正します。

rb

1 def comment_params 2 # 「comment の中の text」を permit する。 3 params.require(:comment).permit(:text) 4 end

これで text は無事に取れるようになるはずです。
しかし、今度は params 直下の post_id が取得できなくなってしまいました。
そこで、次に create アクションを以下のように修正します。

rb

1 def create 2 # post_id は直接 params[:post_id] のように指定する 3 Comment.create(text: comment_params[:text], post_id: params[:post_id], user_id: current_user.id) 4 end

これで、 text も post_id もちゃんと読み取れるはずです。お試しください。

投稿2020/01/15 04:39

編集2020/01/15 08:21
shinoharat

総合スコア1674

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

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

dokodoko

2020/01/15 07:38

回答ありがとうございます。返信おくれてしまいすいません。 binding.pryで確認した所データ自体は送信できている用です。 "utf8"=>"✓", "authenticity_token"=>"==", "comment"=>{"text"=>"ccccc"}, "commit"=>"Create Comment", "controller"=>"comments", "action"=>"create", "post_id"=>"5"} permitted: false>
shinoharat

2020/01/15 07:57

やっぱりそうですね。原因分かりました。回答を編集するので少々お待ちください。
dokodoko

2020/01/15 08:08

ありがとうございます。
shinoharat

2020/01/15 08:23

追記しました! 解説も載せたので少し長くなっちゃいましたが、修正自体は軽微です。 またご確認ください????
dokodoko

2020/01/15 09:10

ありがとうございます!!!! 保存できました。 めちゃくちゃわかりやすく教えてくれてありがとうございます 解説までつけてくれて本当に助かりました! こちらの質問が少しぎこちなかった部分があったのでわかりにくい部分があったと思いますが最後まで私のために付き合ってくれてありがとうございました。 shinoharatさんの優しさに感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問