実現したいこと
ボタンを押したときにチャットルームが作成される(rooms
コントローラーのcreate
アクション)ようにしたいのですが、なぜかGETで処理されエラーが出るため、原因をご教授いたますと幸いです。
前提
こちらの記事を参考にRailsでダイレクトメッセージ機能を実装中しています(記事とは違いdeviseなしで実装しようとしています)。テストユーザー1
でログイン状態にし、http://localhost:3000/users/2
にアクセスし「チャットを始める」ボタンを押すと、以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
No route matches [GET] "/rooms"
ルーティングがGETで認識されているようです。
該当のソースコード
ruby:app/controllers/users_controller.rb
1class UsersController < ApplicationController2 before_action :set_user, :only => [:show, :favorites, :comments, :destroy]3 4 def new5 @user = User.new6 end7 8 def create9 @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 else15 render("users/new")16 end17 end18 19 def edit20 @user = User.find_by(id: params[:id])21 end22 23 def update24 @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 else31 render("users/edit")32 end33 end34 35 def destroy36 @user = User.find_by(params[:id])37 session[:user_id] = @user.id 38 @user.destroy 39 flash[:notice] = "ユーザーを削除しました。"40 redirect_to :root #削除に成功すればrootページに戻る41 end42 43 def index44 @users=User.all 45 end46 47 def show48 @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 else54 @currentUserEntry.each do |cu|55 @userEntry.each do |u|56 if cu.room_id == u.room_id then57 @isRoom = true58 @roomId = cu.room_id 59 end60 end61 end62 if @isRoom63 else64 @room = Room.new65 @entry = Entry.new66 end67 end68 end69 70 private71 72 # def user_params73 # params.require(:user).permit(:name, :email)74 # end75 76 def set_user77 @user = User.find_by(:id => params[:id])78 end79end
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 < ApplicationController2 def create3 @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 end9 10 def show11 @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.new16 @entries = @room.entries 17 else18 redirect_back(fallback_location: root_path)19 end20 end21end
試したこと
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
0 コメント