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

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

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

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

Q&A

解決済

1回答

1044閲覧

コメントを投稿しようとすると、Unknown actionエラー

moto12

総合スコア15

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/03 06:13

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

チャットルームアプリを作っています。roomを作成し、その中で他のユーザーとメッセージのやりとりをするシンプルなものです。

【問題点】
roomの中で投稿されたメッセージをクリックすると、コメントページに行き、
そこでコメント欄に文字を打ち込みコメント投稿しようとすると、unknown actionエラーが出る。

【疑問】 コメントを投稿し、テーブルに保存するので newアクション、createアクションが動くと思っていたのに、なぜupdateメソッドが動いているのでしょうか。ここを教えて頂けると大変ありがたいです。そして、どのようにしたらコメントが保存されるのでしょうか。

エラーメッセージ Unknown action The action 'update' could not be found for RoomsController

該当のソースコード

Ruby

1new.html.erb (comment)】 2 <div class="container"> 3 <% if current_user %> 4 <%= form_with(model: [@room], local: true) do |f| %> 5 <%= f.text_area :text, placeholder: "コメントする", rows: "2" %> 6 <%= f.submit "SEND" %> 7 <% end %> 8 <% else %> 9 <strong><p>※※※ コメントの投稿には新規登録/ログインが必要です ※※※</p></strong> 10 <% end %> 11 </div>

Ruby

1【comments.controller.rb】 2class CommentsController < ApplicationController 3 4 def index 5 @message = Message.new 6 @room = Room.find(params[:room_id]) 7 @messages = @room.messages.includes(:user).order("created_at DESC") 8 end 9 10 def new 11 @comment = Comment.new 12 @message = Message.new 13 @room = Room.find(params[:room_id]) 14 @messages = @room.messages.includes(:user).order("created_at DESC") 15 end 16 17 def create 18 if @comment = Comment.create(comment_params) 19 redirect_to root_path 20 else 21 render :new 22 end 23 end 24 25 private 26 def comment_params 27 params.require(:comment).permit(:text).merge(user_id: current_user.id, message_id: params[:message_id]) 28 end 29end 30

Ruby

1【_main_chat.html.erb】 2<div class="chat-header"> 3 <div class="left-header"> 4 <div class="header-title"> 5 <%= @room.name %> 6 </div> 7 </div> 8 <div class="right-header"> 9 <div class="header-button"> 10 <% if current_user.genre == "教員"%> 11 <%=link_to "ルーム削除", room_path(@room), method: :delete %> 12 <% end %> 13 </div> 14 </div> 15</div> 16 17<div class="messages"> 18<div class="message"> 19 <div class="upper-message"> 20 <div class="message-user"> 21 <%= message.user.name %> 22 </div> 23 <div class="message-date"> 24 <%= l message.created_at %> 25 </div> 26 </div> 27 <div class="lower-message"> 28 <div class="message-content"> 29 <%=link_to message.content, new_room_message_comment_path(@room, @messages) %> 30 </div> 31 <%= image_tag message.image.variant(resize: '400x400'), class: 'message-image' if message.image.attached? %> 32 </div> 33 34</div> 35</div> 36 37<%= form_with model: [@room, @message], class: 'form', local: true do |f| %> 38 <div class="form-input"> 39 <%= f.text_field :content, class: 'form-message', placeholder: 'type a message' %> 40 <label class="form-image"> 41 <span class="image-file">画像</span> 42 <%= f.file_field :image, class: 'hidden' %> 43 </label> 44 </div> 45 <%= f.submit '送信', class: 'form-submit' %> 46<% end %> 47

Ruby

1【routes.rb】 2Rails.application.routes.draw do 3 devise_for :users 4 get 'messages/index' 5 get 'comments/index' 6 root to: "rooms#index" 7 resources :users 8 resources :rooms do 9 resources :messages do 10 resources :comments 11 end 12 end 13end 14

Ruby

1【coment.rb】 2class Comment < ApplicationRecord 3 belongs_to :message 4 belongs_to :user 5end 6

Ruby

1【rooms.controller.rb】 2class RoomsController < ApplicationController 3 4 def index 5 end 6 7 def new 8 @room = Room.new 9 end 10 11 def create 12 @room = Room.new(room_params) 13 if @room.save 14 redirect_to root_path 15 else 16 render :new 17 end 18 end 19 20 def destroy 21 room = Room.find(params[:id]) 22 room.destroy 23 redirect_to root_path 24 end 25 26 private 27 28 def room_params 29 params.require(:room).permit(:name, user_ids: []) 30 end 31end 32

Ruby

1 room_message_comments GET /rooms/:room_id/messages/:message_id/comments(.:format) comments#index 2 POST /rooms/:room_id/messages/:message_id/comments(.:format) comments#create 3 new_room_message_comment GET /rooms/:room_id/messages/:message_id/comments/new(.:format) comments#new 4 room_message_comment GET /rooms/:room_id/messages/:message_id/comments/:id(.:format) comments#show 5 6```Ruby 7

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

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

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

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

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

guest

回答1

0

ベストアンサー

form_with(model: [@room], だからです。
@roomは「既存」の 「Roomのインスタンス」ですね?
ですから RoomsController の updateが呼ばれます

投稿2020/11/03 06:20

winterboum

総合スコア23347

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

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

moto12

2020/11/03 07:53

解決しました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問