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

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

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

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

Q&A

解決済

3回答

9941閲覧

railsでcreateメソッドをしてもデータベースにデータが保存されない。

dokodoko

総合スコア20

Ruby on Rails

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

1グッド

2クリップ

投稿2019/04/14 10:20

編集2019/04/29 12:46

https://qiita.com/nojinoji/items/2034764897c6e91ef982

のサイトで練習しています。

エラーはでないのですがhttps://gyazo.com/f1e8856d95901e3f36973425b4bb7517

のようにコメントをcreateしても、なぜかデータベースに保存されません。

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 private def comment_params params.require(:comment).permit(:content) end end
<h1>投稿詳細ページ</h1> <h3><%= @post.user.email %></h3> <h3><%= @post.content %></h3> <h2>コメント一覧</h2> <% @comments.each do |c| %> <div> <a href="/users/<%= @post.user.id %>"><%= c.user.email %></a> <%= c.content %> <hr> </div> <% end %> <%= form_for [@post, @comment] do |f| %> <%= f.text_field :content %> <br> <%= f.submit 'コメントする' %> <% end %> <%= link_to "ホームへ戻る", posts_path %>

教えてもらえると助かりますm(_ _)m
よろしくお願いします

自分の書き方に問題があると思うのですがエラーになってしまいました。
せっかく回答していただいたのに活かせずに申し訳ありません。

変更した記述

class CommentsController < ApplicationController def create @comment = current_user.comment.build(comment_params) if @comment.save redirect_back(fallback_location: root_path) else redirect_back(fallback_location: root_path) end end private def comment_params params.require(:comment).permit(:content) end end

出てしまったエラー
NoMethodError in CommentsController#create
undefined method `comment' for #<User
Did you mean? comments comments=
Extracted source (around line #3)
class CommentsController < ApplicationController
def create
@comment = current_user.comment.build(comment_params)
@comment.user_id = current_user.id
if @comment.save
redirect_back(fallback_location: root_path)

試したこと

こちらの記述を変更する

<h1>投稿詳細ページ</h1> <h3><%= @post.user.email %></h3> <h3><%= @post.content %></h3> <h2>コメント一覧</h2> <% @comments.each do |c| %> <div> <a href="/users/<%= @post.user.id %>"><%= c.user.email %></a> <%= c.content %> <hr> </div> <% end %>

<%= form_for [@comment] do |f| %>   ※@post を消す
<%= f.text_field :content %>
<br>
<%= f.submit 'コメントする' %>
<% end %>

<%= link_to "ホームへ戻る", posts_path %>


改善点

class CommentsController < ApplicationController def create @comment = post.comments.build(current_user) if @comment.save redirect_back(fallback_location: root_path) else redirect_back(fallback_location: root_path) end end private def comment_params params.require(:comment).permit(:content) end end

NameError in CommentsController#create
undefined local variable or method `post' for #

Extracted source (around line #4):

def create
@comment = post.comments.build(current_user)
if @comment.save
redirect_back(fallback_location: root_path)
else

エラーをみるにおそらく@comment = post.comments.build(current_user)
上の文にあるこのpostが定義されていないという事だと思います。

試した事

class CommentsController < ApplicationController def create @comment = @post.comments.build(comment_params) if @comment.save redirect_back(fallback_location: root_path) else redirect_back(fallback_location: root_path) end end private def comment_params params.require(:comment).permit(:content) end end

エラーの原因としてform_forへ受け渡しができていないとおもいましたが違いました。

<%= form_for [@post,@comment] do |f| %>
<%= f.text_field :content %>
<br>
<%= f.submit 'コメントする' %>
<% end %>

<%= link_to "ホームへ戻る", posts_path %>


改善点②

@comment = current_user.comment.build(comment_params)
上を下に改善した結果エラーは改善しました。ですがやはりデータベースに保存されません。
@comment = current_user.comments.build(comment_params)

def create @comment = current_user.comments.build(comment_params) if @comment.save redirect_back(fallback_location: root_path) else redirect_back(fallback_location: root_path) end end private def comment_params params.require(:comment).permit(:content) end end

次に

binding.pryで確認しました。 

"utf8"=>"✓", "authenticity_token"=> "comment"=>{"content"=>"v"}, "commit"=>"コメントする", "controller"=>"comments", "action"=>"create", "post_id"=>"4"} permitted: false>

上記を見るにデータ自体はおくられています。ですがここをみるに → permitted: false

ここで許可が降りてないのだと思います。

class CommentsController < ApplicationController def create binding.pry @comment = post.comments.build(comment_params) if @comment.save redirect_back(fallback_location: root_path) else redirect_back(fallback_location: root_path) end end private def comment_params params.require(:comment).permit(:content) end end
退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

結構書き換えてしまいますが、以下のようにしてはいかがでしょう??

ruby

1<%= form_for @comment do |f| %> 2 <%= f.text_field :content %> 3 <br> 4 <%= f.submit 'コメントする' %> 5<% end %>

ruby

1class CommentsController < ApplicationController 2 3 def create 4 @comment = Comment.new(comment_params) 5 @comment.user_id = current_user.id 6 if @comment.save 7 redirect_back(fallback_location: root_path) 8 else 9 redirect_back(fallback_location: root_path) 10 end 11 end 12 13 private 14 def comment_params 15 params.require(:comment).permit(:content) 16 end 17end

user_id は、可能ならビュー側で
= f.hidden_field :user_id, value: current_user.id
を作成して渡してもいいと思いますが、まずは単純な方法から試していきましょう。

※参考
Ruby on Rails - hidden_fieldの使い方

補足

一見して意味がなさそうな @post が処理を複雑にしているように見えました。
必要なのであれば、親子データをまとめて作成する fields_for を勉強して使った方が処理が明確になると思います。
fields_forの上手な使い方

投稿2019/04/27 17:36

編集2019/04/29 12:18
siruku6

総合スコア1382

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

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

dokodoko

2019/04/29 13:15

何とか解決出来ましたと報告させて頂きたくて色々と試してみたのですが私の力不足で解決まで出来ませんせした。 アドバイスを活かせず申し訳ない気持ちでいっぱいです。 ですが二週間近くも解決出来ずにいた質問に対して回答して頂いた事は本当に感謝しかありません ありがとうございました。
siruku6

2019/04/29 13:34

うーん、解決できなかったんですね。。。 私も悔しいです。 またお力になれそうであれば回答しますので質問して下さい。 (土日祝日しか回答できません)
dokodoko

2019/04/29 13:43

コメントありがとうございました。 私としてはこれ以上、ベストアンサーを決めないまま質問を引っ張るのは失礼だと思ったのでベストアンサーを決めた上で質問締め切った方がいいのかなと思いました。 ですがsiruku6さんがよろしければ編集してどのようなエラーになったのか書かせて頂きます。 それともこのサイトに載ってる書き方は上級者向きでしょうか? https://qiita.com/nojinoji/items/2034764897c6e91ef982 度々質問して申し訳ありません。
siruku6

2019/04/29 15:28

そうですね、質問する場合は、新しく立て直した方がいいのではないかと思います。 つまづく箇所もきっと変わってきていると思いますので。 それとは別に、サイトに軽く目を通させていただきました。 上級者向けということはなさそうです。 ただ、 [Commentモデルをつくろう] https://qiita.com/nojinoji/items/2034764897c6e91ef982#comment%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8D%E3%81%86 ↑ここの手前までは楽々できる、というレベルに達していないと、ちょっと難しいかもしれません。 理由は、ソースコードに対する解説がほぼないからです。 もし、先ほどの箇所までくるのに手こずるようであれば、別途初心者向けの解説が手厚いサイトを探すか、アプリ自作方法を解説する初心者向けの本で勉強した方が効率がよさそうです。 (もちろん解説が手厚いもので)
dokodoko

2019/04/29 19:09 編集

アドバイスありがとうございます。 確かに質問がある場合はもう一度立て直した方が良さそうです。 サイトの方にも目を通して頂いてありがとうございます。 最初の方からわかわらない箇所が所々あるので自分で調べながらやっていました。 ただ初心向けなのか上級者向けなのかどうやって判断すればいいのかわからなかったのですが解説が手厚いかどうかを重視してみようとおもいます。 なので解説が手厚く初心者向けなのを探してみようと思います。ありがとうございました。
guest

0

エラーについて

undefined method `comment'

commentというメソッドは定義されていないと出ています。
なぜ出ているかは、Qiitaの方を見た限りだと、

has_many :comments

commentsを関連付けしており、UserCommentの関係は、1:多になっていると思います。

参考

コメントの保存について

上記の記事をを参考していただければ、分かるかと思いますが、今回保存する対象は、

  • 新規コメント
  • Userに関連付けるComment

なので、例えば以下のような感じになるかと

@comment = post.comments.build(current_user)

補足

UserCommentの2つのテーブルに対して更新をかけるので、トランザクション処理は入れておいたほうがいいですね

絶対に抑えたいTransactionのポイントを三つにまとめてみた

投稿2019/04/16 03:47

kitaro_tn

総合スコア49

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

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

dokodoko

2019/04/20 06:07 編集

せっかく親切で答えてくださっているのに返信遅れてしまいすいません。 Transactionは複数sqlが絡む時に片方だけ反映されると困るから両方反映した場合のみ実行させるという事はなんとなくわかりました。 @comment = post.comments.build(current_user) つまりpostの部分でTransactionがかかってるという事ですか?
dokodoko

2019/04/29 13:22

私の質問のエラーについて真摯に対応してくださりありがとうございました。 参考になる記事のリンク先まで貼って頂きありがとうございました。
guest

0

@comment = current_user.comment.build(comment_params)

これで作れば解決すると思います。
意味はわかりますかね?

投稿2019/04/15 22:07

Yaiba184

総合スコア122

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

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

dokodoko

2019/04/29 13:23

私の質問に対して最初に回答して頂きありがとうございました。 今までbulidメソッドの知識がなかったため参考になりました。 お礼のコメントが遅れてしまい申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問