実現したいこと
- GETで認識されているルーティングのエラーを解決したい
ボタンを押したときにチャットルームが作成される(rooms
コントローラーのcreate
アクション)ようにしたいのですが、なぜかGETで処理されエラーが出るため、原因をご教授いたますと幸いです。
前提
こちらの記事を参考にRailsでダイレクトメッセージ機能を実装中しています(記事とは違いdeviseなしで実装しようとしています)。テストユーザー1
でログイン状態にし、http://localhost:3000/users/2
にアクセスし「チャットを始める」ボタンを押すと、以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
No route matches [GET] "/rooms"
ルーティングがGETで認識されているようです。
該当のソースコード
ruby:config/routes.rb
1Rails.application.routes.draw do 2 root "home#top" 3 post "users/create" => "users#create", as: "create_users" 4 get "users/:id/edit" => "users#edit", as:"edit_users" 5 post "users/:id/update" => "users#update", as:"update_users" 6 get "signup", to: "users#new", as: "new_users" 7 post "guest_login", to: "guest_sessions#guest_login" 8 get "guest_login", to: "guest_sessions#guest_login" 9 post "logout" => "sessions#destroy" 10 get "logout" => "sessions#destroy" 11 get "login", to: "sessions#new", as: "new_sessions" 12 post "login", to: "sessions#create", as: "create_sessions" 13 delete "logout", to: "sessions#destroy", as: "destroy_sessions" 14 get "users/:id/destroy", to: "users#destroy" 15 delete "users/:id/destroy", to: "users#destroy", as: "destroy_users" 16 get "users/index" => "users#index" 17 get "users/:id" => "users#show" 18 resources :messages, :only => [:create] 19 resources :rooms, :only => [:create, :show] 20end
ruby:app/controllers/users_controller.rb
1class UsersController < ApplicationController 2 before_action :set_user, :only => [:show, :favorites, :comments, :destroy] 3 4 def new 5 @user = User.new 6 end 7 8 def create 9 @user = User.new(email: params[:email], password_digest: params[:password_digest]) 10 if @user.save 11 session[:user_id] = @user.id 12 flash[:notice] = "ユーザー登録が完了しました" 13 redirect_to root_path 14 else 15 render("users/new") 16 end 17 end 18 19 def edit 20 @user = User.find_by(id: params[:id]) 21 end 22 23 def update 24 @user = User.find_by(id: params[:id]) 25 @user.name = params[:name] 26 @user.email = params[:email] 27 if @user.save 28 flash[:notice] = "ユーザー情報を編集しました" 29 redirect_to root_path 30 else 31 render("users/edit") 32 end 33 end 34 35 def destroy 36 @user = User.find_by(params[:id]) 37 session[:user_id] = @user.id 38 @user.destroy 39 flash[:notice] = "ユーザーを削除しました。" 40 redirect_to :root #削除に成功すればrootページに戻る 41 end 42 43 def index 44 @users=User.all 45 end 46 47 def show 48 @user = User.find(params[:id]) 49 @current_user = User.find_by(id: session[:user_id]) 50 @currentUserEntry = Entry.where(user_id: @current_user.id) 51 @userEntry = Entry.where(user_id: @user.id) 52 if @user.id == @current_user.id 53 else 54 @currentUserEntry.each do |cu| 55 @userEntry.each do |u| 56 if cu.room_id == u.room_id then 57 @isRoom = true 58 @roomId = cu.room_id 59 end 60 end 61 end 62 if @isRoom 63 else 64 @room = Room.new 65 @entry = Entry.new 66 end 67 end 68 end 69 70 private 71 72 # def user_params 73 # params.require(:user).permit(:name, :email) 74 # end 75 76 def set_user 77 @user = User.find_by(:id => params[:id]) 78 end 79end
ruby:app/views/users/show.html.erb
1<% unless @user.id == @current_user.id %> 2 <% if @isRoom == true %> 3 <p class="user-show-room"><a href="/rooms/<%= @roomId %>" class="btn btn-primary btn-lg">チャットへ</a> 4 <% else %> 5 <%= form_with model: @room do |f| %> 6 <%= fields_for @entry do |e| %> 7 <%= e.hidden_field :user_id, value: @user.id %> 8 <% end %> 9 <%= f.submit "チャットを始める", class:"btn btn-primary btn-lg user-show-chat" %> 10 <% end %> 11 <% end %> 12<% end %> 13
ruby:app/controllers/rooms_controller.rb
1class RoomsController < ApplicationController 2 def create 3 @current_user = User.find_by(id: session[:user_id]) 4 @room = Room.create 5 @entry1 = Entry.create(room_id: @room.id, user_id: @current_user.id) 6 @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(room_id: @room.id)) 7 redirect_to "/rooms/#{@room.id}" 8 end 9 10 def show 11 @current_user = User.find_by(id: session[:user_id]) 12 @room = Room.find(params[:id]) 13 if Entry.where(user_id: @current_user.id,room_id: @room.id).present? 14 @messages = @room.messages 15 @message = Message.new 16 @entries = @room.entries 17 else 18 redirect_back(fallback_location: root_path) 19 end 20 end 21end
試したこと
rails routes
でルーティングを確認しました。
rooms
コントローラーのcreate
アクションはきちんと設定されているようです。
$ rails routes Prefix Verb URI Pattern Controller#Action root GET / home#top create_users POST /users/create(.:format) users#create edit_users GET /users/:id/edit(.:format) users#edit update_users POST /users/:id/update(.:format) users#update new_users GET /signup(.:format) users#new guest_login POST /guest_login(.:format) guest_sessions#guest_login GET /guest_login(.:format) guest_sessions#guest_login logout POST /logout(.:format) sessions#destroy GET /logout(.:format) sessions#destroy new_sessions GET /login(.:format) sessions#new create_sessions POST /login(.:format) sessions#create destroy_sessions DELETE /logout(.:format) sessions#destroy GET /users/:id/destroy(.:format) users#destroy destroy_users DELETE /users/:id/destroy(.:format) users#destroy users_index GET /users/index(.:format) users#index GET /users/:id(.:format) users#show messages POST /messages(.:format) messages#create rooms POST /rooms(.:format) rooms#create room GET /rooms/:id(.:format) rooms#show rails_postmark_inbound_emails POST /rails/action_mailbox/postmark/inbound_emails(.:format) action_mailbox/ingresses/postmark/inbound_emails#create (文字数制限のため以下省略)
show.html.erb
ファイルのform_with
あたりに問題があるかと思い調べましたが、自分では原因がわかりませんでした。
補足情報(FW/ツールのバージョンなど)
- ruby 3.1.3p185
- Rails 7.0.4.3
回答1件
あなたの回答
tips
プレビュー