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

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

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

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

Q&A

解決済

2回答

643閲覧

[ruby on rails] 投稿コメントの保存ができません

sato_sato

総合スコア8

Ruby on Rails 6

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

0グッド

0クリップ

投稿2023/02/13 14:35

編集2023/02/14 22:04

実現したいこと

・コメント機能の実装

前提

・ruby on railsでユーザー認証機能を行い、画像投稿ができ、投稿に対してコメント・いいねできるwebサイトを作成しています。
・現在、ログイン後、投稿に対してコメント実装中。
・サイト上でのエラーメッセージは出ていません。

質問内容の詳細

・コメント投稿フォームから投稿すると、詳細ページに戻りますが、データを受け取れていないのかコメントのカウントは0のままです。
・初心者でデータの行き来を理解していない部分があります。
・拙い文章で失礼します。

/config/routes.rb Rails.application.routes.draw do devise_for :users root to: "homes#top" get "/homes/about" => "homes#about", as: "about" resources :post_images, only: [:new, :create, :index, :show, :destroy] do resources :post_comments, only: [:create, :destroy] end resources :users, only: [:show, :edit, :update] # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end
/app/controllers/post_comments_controller.rb class PostCommentsController < ApplicationController def create post_image = PostImage.find(params[:post_image_id]) comment = current_user.post_comments.new(post_comment_params) comment.post_image_id = post_image.id comment.save redirect_to post_image_path(post_image) end def destroy PostComment.find(params[:id]).destroy redirect_to post_image_path(params[:post_image_id]) end private def post_comment_params params.require(:post_comment).permit(:comment) end end
/app/views/post_images/show.html.erb <div> <%= image_tag @post_image.get_image %> <p>ショップ名:<%= @post_image.shop_name %></p> <p>説明:<%= @post_image.caption %></p> <p>投稿ユーザー画像:<%= image_tag @post_image.user.get_profile_image(100,100) %></p> <p>ユーザーネーム:<%= @post_image.user.name %></p> <p>投稿日:<%= @post_image.created_at.strftime('%Y/%m/%d') %></p> <% if @post_image.user == current_user %> <%= link_to "削除", post_image_path(@post_image), method: :delete %> <% end %> </div> <div> <p>コメント件数:<%= @post_image.post_comments.count %></p> <% @post_image.post_comments.each do |post_comment| %> <p><%= image_tag post_comment.user.get_profile_image(100,100) %></p> <%= post_comment.user.name %> <%= post_comment.created_at.strftime('%Y/%m/%d') %><%= post_comment.comment %> <% if post_comment.user == current_user %> <%= link_to "削除", post_image_post_comment_path(post_comment.post_image, post_comment), method: :delete %> <% end %> <% end %> </div> <div> <%= form_with model: [@post_image, @post_comment] do |f| %> <%= f.text_area :comment, rows: '5', placeholder: "コメントをここに" %> <%= f.submit "送信する" %> <% end %> </div>

試したこと

・contorller.rbでsave!メソッドを追加したところ、下記のエラーメッセージが出ました。

イメージ説明

補足情報(FW/ツールのバージョンなど)

・Rails version 6.1.7

よろしくお願いいたします。

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

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

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

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

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

yuma.inaura

2023/02/13 14:37

comment.save! で例外発生させてみましょう
sato_sato

2023/02/13 16:25

コメント頂きありがとうございます。 本文の「試したこと」に追記したのですが、/app/controllers/post_comments_controller.rbにsave!メソッドを追記したところ、新たなエラーメッセージが出ました。 やはり、そもそも保存できてなかったようです。。
guest

回答2

0

Commentのsaveで PostImage を要求されるというのは「実世界からみて」不自然です。
Post があって、それに PostImage が張り付いていて、それに対する Comment なのでしょうから。
ということは model の設計が混乱しています。
Post、PostImage、PostComment がそれぞれどういうデータを持っているものか、というのを整理しなおしてみて。

なお、
Rails の「黙ってるとこう理解されるよ」という点からみると、PostImage、PostComment は命名ちょっとまずいです。「Post以外にも Image、Comment がぶら下がるモデルがある」 のでなければ Image、Comment がよいです。
見た目も post.post_image、post.post_comments より、post.image, post.comments の方が流れが良いし。

PostImage から受ける第一印象は 「Post と Image は 多対多 なのだな。これはその中間table」

投稿2023/02/14 05:15

winterboum

総合スコア23267

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

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

0

自己解決

解決しました。
モデルの記述が間違っておりました。

PostImageモデル(投稿データ)から見てPostCommentモデル(コメント)は1:NのN側のはずなのに
PostComment側でbelong_to :post_images と記述することで、PostImageをN側と見るような形にしておりました。
(正しくはbelong_to :post_imageとし、PostImage(投稿データ)を1:Nの1と見る)

質問の準備が足りない点があり失礼いたしました。
質問に対してご回答をお寄せ頂きありがとうございます。

models/post_comment.rb class PostComment < ApplicationRecord # why use belongs_to? => :user,:post_image両方から見て1:NのN側 belongs_to :user belongs_to :post_image end

投稿2023/02/14 13:02

編集2023/02/14 13:04
sato_sato

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問