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

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

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

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

1222閲覧

コメントをDBに保存できるようにしたい

tattobu

総合スコア16

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2021/10/15 13:20

写真とテキストを投稿してその投稿にコメントができるアプリケーションを作成しています。
今回、写真とテキストまでは投稿できるようになったのですが、
コメントを送信してもエラーは発生しないのですが、
データベースに保存されない状態です。
考えても答えに辿り着けなかったため前に進めないでいます。

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

コメントを送信してもエラーメッセージは出ず、DBを確認するも保存されていない。

該当のソースコード

show.html.erb

ruby

1<main class="main"> 2 <div class="inner"> 3 <div class="prototype__wrapper"> 4 <p class="prototype__hedding"> 5 <%= @prototype.title %> 6 </p> 7 <%= link_to "by #{@prototype.user.name}", root_path, class: :prototype__user %> 8 <% if user_signed_in? && current_user.id == @prototype.user_id %> 9 <div class="prototype__manage"> 10 <%= link_to "編集する", edit_prototype_path(@prototype), class: :prototype__btn %> 11 <%= link_to "削除する", "/prototypes/#{@prototype.id}",method: :delete, class: :prototype__btn %> 12 </div> 13 <% end %> 14 <div class="prototype__image"> 15 <%= image_tag @prototype.image if @prototype.image.attached? %> 16 </div> 17 <div class="prototype__body"> 18 <div class="prototype__detail"> 19 <p class="detail__title">キャッチコピー</p> 20 <p class="detail__message"> 21 <%= @prototype.catch_copy %> 22 </p> 23 </div> 24 <div class="prototype__detail"> 25 <p class="detail__title">コンセプト</p> 26 <p class="detail__message"> 27 <%= @prototype.concept %> 28 </p> 29 </div> 30 </div> 31 <div class="prototype__comments"> 32 <% if user_signed_in? %> 33 <%= form_with(model:[@prototype,@comment],local: true) do |f| %> 34 <div class="field"> 35 <%= f.label :content, "コメント" %><br /> 36 <%= f.text_field :content, id:"comment_content" %> 37 </div> 38 <div class="actions"> 39 <%= f.submit "送信する", class: :form__btn %> 40 </div> 41 <% end %> 42 <% end %> 43 <ul class="comments_lists"> 44 <%# 投稿に紐づくコメントを一覧する処理を記述する %> 45 <% @comments.each do |comment| %> 46 <li class="comments_list"> 47 <%= comment.content %> 48 <%= link_to comment.user.name, root_path, class: :comment_user %> 49 </li> 50 <% end %> 51 <%# // 投稿に紐づくコメントを一覧する処理を記述する %> 52 </ul> 53 </div> 54 </div> 55 </div> 56</main> 57

comments_controller.rb

ruby

1class CommentsController < ApplicationController 2 3 def create 4 @comment = Comment.new(comment_params) 5 if @comment.save 6 redirect_to prototype_path 7 else 8 @prototype = Prototype.find(params[:prototype_id]) 9 @comments = @prototype.comments 10 render "prototypes/show" 11 end 12 end 13 14 private 15 def comment_params 16 params.require(:comment).permit(:content).merge(user_id: current_user.id, prototype_id: params[:prototype_id] ) 17 end 18end 19

prototypes_controller.rb

ruby

1class PrototypesController < ApplicationController 2 def index 3 @prototypes = Prototype.all 4 end 5 6 def new 7 @user = User.new 8 @prototype = Prototype.new 9 end 10 11 def create 12 @prototype = Prototype.new(prototype_params) 13 if @prototype.save 14 redirect_to root_path 15 else 16 render :new 17 end 18 end 19 20 def show 21 @prototype = Prototype.find(params[:id]) 22 @comment = Comment.new 23 @comments = @prototype.comments.includes(:user) 24 end 25 26 def edit 27 @prototype = Prototype.find(params[:id]) 28 end 29 30 def update 31 @prototype = Prototype.find(params[:id]) 32 if @prototype.update(prototype_params) 33 redirect_to action: "show" 34 else 35 render :edit 36 end 37 end 38 39 def destroy 40 prototype = Prototype.find(params[:id]) 41 prototype.destroy 42 redirect_to action: "index" 43 end 44 45 46 private 47 48 def prototype_params 49 params.require(:prototype).permit(:title, :catch_copy, :concept, :image).merge(user_id: current_user.id) 50 end 51end

試したこと

save!メソッドを使用して確認してみたところ
以下のようにエラー文が出ました。
ActiveRecord::RecordInvalid in CommentsController#create

また、binding.pryで確認したところ、以下のように表示されたのでデータは正常に送信されているようです。

[1] pry(#<CommentsController>)> params
=> <ActionController::Parameters {"authenticity_token"=>"al6al9c3qbM1C1X8IMZJfsb6iJsMgh0WUu8+rhpohkycU/e9w34/AvPBJ8AWEuSBz0REiAg7p7Xmb94cfqkvzw==", "comment"=>{"content"=>"ai"}, "commit"=>"送信する", "controller"=>"comments", "action"=>"create", "prototype_id"=>"3"} permitted: false>
[2] pry(#<CommentsController>)> comment_params
User Load (0.3ms) SELECT users.* FROM users WHERE users.id = 1 ORDER BY users.id ASC LIMIT 1
↳ app/controllers/comments_controller.rb:17:in `comment_params'
=> <ActionController::Parameters {"content"=>"ai", "user_id"=>1, "prototype_id"=>"3"} permitted: true>

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

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

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

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

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

guest

回答1

0

自己解決

アソシエーションにスペルミスがありました。

ruby

1class Comment < ApplicationRecord 2 belongs_to :users 3 belongs_to :prototypes 4 5 validates :content, presence: true 6end 7

以上の記述のように複数形で記述されていたので

ruby

1class Comment < ApplicationRecord 2 belongs_to :user 3 belongs_to :prototype 4 5 validates :content, presence: true 6end

に編集したところ正常に保存できるようになりました。

投稿2021/10/16 07:24

tattobu

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問