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

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

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

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

Q&A

解決済

2回答

867閲覧

コメントに対する返信コメントが投稿できない。

pancho

総合スコア12

Ruby on Rails

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

0グッド

0クリップ

投稿2020/01/25 06:54

編集2020/01/26 03:56

前提・実現したい

taskのshowで詳細情報を表示しそれに対しての返信コメントを返せるようにしたいのです
イメージ説明

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

返信コメント入力欄に書き込み投稿ボタンを押すと
メッセージの投稿に失敗しました。と出てsave出来ずに帰ってきます。

試したこと

taskのshowページのform_with周りや
Controllerのcreate、reply_paramsなどの打ち間違いチェックはしました。

Rails

1<div class="container"> 2 <div class="row"> 3 <div class="offset-md-3 col-md-6 offset-md-3"> 4 <table class="table table-striped"> 5 <tr> 6 <th>タイトル</th> 7 <td><%= @task.title %></td> 8 </tr> 9 <tr> 10 <th>送信者</th> 11 <td><%= @task.user.name %></td> 12 </tr> 13 <tr> 14 <th>期日</th> 15 <td><%= @task.deadline %></td> 16 </tr> 17 </table> 18 <div class="card"> 19 <div class="card-header"> 20 コメント 21 </div> 22 <div class="card-body"> 23 <%= @task.comment %> 24 </div> 25 </div> 26 27 <%= form_with(model: @reply, local: true) do |f| %> 28 <%= f.label :comment, '返信コメント入力' %> 29 <%= f.text_field :comment %> 30 31 <%= f.submit '投稿' %> 32 <% end %> 33 </div> 34 </div> 35</div>

Rails

1class TasksController < ApplicationController 2 def show 3 @task = Task.find(params[:id]) 4 @reply = Reply.new 5 6 end 7 8 def new 9 @task = current_user.tasks.build 10 end 11 12 def create 13 @task = current_user.tasks.build(task_params) 14 if @task.save 15 flash[:success] = 'メッセージを投稿しました。' 16 redirect_to root_url 17 else 18 @tasks = current_user.tasks.order(id: :desc).page(params[:page]) 19 flash.now[:danger] = 'メッセージの投稿に失敗しました。' 20 render 'toppages/index' 21 end 22 end 23 24 def destroy 25 end 26 27 private 28 29 def task_params 30 params.require(:task).permit(:title, :staff, :deadline, :comment) 31 end 32end 33

Rails

1class RepliesController < ApplicationController 2 3 def index 4 @reply = Replies.all 5 end 6 7 def create 8 @reply = Reply.new(reply_params) 9 if @reply.save 10 flash[:success] = 'メッセージを投稿しました。' 11 redirect_to @replies 12 else 13 @tasks = Task.where(staff: current_user.name) 14 flash.now[:danger] = 'メッセージの投稿に失敗しました。' 15 render 'toppages/index' 16 end 17 end 18 19 private 20 21 def reply_params 22 params.require(:reply).permit(:comment) 23 end 24end 25

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

バリデーションの書き方も合っているのか不安になったので載せておきます。

Rails

1class User < ApplicationRecord 2 before_save { self.email.downcase! } 3 validates :name, presence: true, length: { maximum: 50 } 4 validates :email, presence: true, length: { maximum: 255 }, 5 format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i }, 6 uniqueness: { case_sensitive: false } 7 has_secure_password 8 9 has_many :tasks 10 has_many :replies 11end

Rails

1class Task < ApplicationRecord 2 belongs_to :user 3 has_many :replies 4end

Rails

1class Reply < ApplicationRecord 2 belongs_to :title, class_name: 'Task' 3 belongs_to :user 4end

class Reply  のDBです

Rails

1class CreateReplies < ActiveRecord::Migration[5.2] 2 def change 3  create_table :replies do |t| 4   t.references :title, foreign_key: { to_table: :tasks } 5   t.references :user, foreign_key: true 6   t.string :comment 7 8   t.timestamps 9  end 10 end 11end

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

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

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

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

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

guest

回答2

0

自己解決

コメントありがとうございます。
教えてもらった方法ではどうも上手く行かず
何処か他の所が悪いのか?といじっていると
TasksControllerのshowを
@reply = Reply.new → @reply = current_user.replies.build に変え

Tasks/showのhidden_fieldを
<%= f.hidden_field :title, :value => @task.title %>

にする事で投稿する事が出来るようになりました。
色々と助言ありがとうございました。

投稿2020/01/26 06:53

pancho

総合スコア12

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

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

0

Reply は
belongs_to :title, class_name: 'Task'
belongs_to :user
になっています。user_id と task_id が必須です。
しかしいまの@reply = Reply.new(reply_params)では comment しか与えられていません。
view の form に hiddenでtask_id を入れ渡しましょう。
user_id は cuerrent_userですから、hiddenで渡しても良いし、controller内で reply_params.merge()してもよいし

投稿2020/01/25 07:01

winterboum

総合スコア23329

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

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

pancho

2020/01/25 07:51

早速の回答ありがとうございます。 form を <%= form_with(model: @reply, local: true) do |f| %>   <%= f.hidden_field :title, :value => @task.id %> <%= f.hidden_field :user, :value => current_user %> <%= f.label :comment, '返信コメント入力' %> <%= f.text_field :comment %>   <%= f.submit '投稿' %> <% end %> に変えた所 投稿の失敗には行かなかったもののその手前 @reply = Reply.new(reply_params) で止まりました。 エラー名は ActiveRecord::AssociationTypeMismatch in RepliesController#create Task(#69967401207260) expected, got "1" which is an instance of String(#16367080) Extracted source (around line #8): 6 def create 7 @reply = Reply.new(reply_params) 8 if @reply.save 9 flash[:success] = 'メッセージを投稿しました。' 10 redirect_to @replies Rails.root: /home/ec2-user/environment/nishibako Application Trace | Framework Trace | Full Trace app/controllers/replies_controller.rb:8:in `create' Request Parameters: {"utf8"=>"✓", "authenticity_token"=>"4ttMzNJXVyELn7RWZZiZhS+n/EYTAS91gwx4lx2LwHNwAyvr3w8U9e1d4g+AJST+G1BTBfdHkxejE2Tm9188Jg==", "reply"=>{"title"=>"1", "user"=>"2", "comment"=>"只今作成中です。"}, "commit"=>"投稿"}
winterboum

2020/01/25 08:05

<%= f.hidden_field :title, :value => @task.id %> の妥当性見たいので、class Reply  のDB定義見せてください。 <%= f.hidden_field :user, :value => current_user %> ここはこれで良いか不安 <%= f.hidden_field :user_id, :value => current_user.id %> なら安心
pancho

2020/01/26 03:03

class Reply のDBです class CreateReplies < ActiveRecord::Migration[5.2] def change create_table :replies do |t| t.references :title, foreign_key: { to_table: :tasks } t.references :user, foreign_key: true t.string :comment t.timestamps end end end
winterboum

2020/01/26 03:21

プログラムは質問本文を編集して、そちらに移してください
winterboum

2020/01/26 03:57

<%= f.hidden_field :title, :value => @task.id %> title_id でなく title だから <%= f.hidden_field :title, :value => @task %> なのかなぁ それで駄目だったら <%= f.hidden_field :title_id, :value => @task.id %> でも試してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問