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

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

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

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

708閲覧

Rails7 「No route matches [GET]」のエラーを解決したい

AIR11451481019

総合スコア9

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2023/04/29 07:44

編集2023/04/29 11:34

実現したいこと

  • 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

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

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

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

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

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

shinoharat

2023/05/01 05:02

app/views/users/show.html.erb は質問文に載っているコードですべてですか? 省略せずにすべてを載せてもらえると助かります。
shinoharat

2023/05/01 05:10 編集

それと、ブラウザのF12ツールで <form> を確認し、 action と method がどういう値になっているかも見て欲しいです。
AIR11451481019

2023/05/08 02:15

shinoharatさんコメントありがとうございます。 こちらダイレクトメッセージ機能は別の方法で実装することにしたので、エラーの解決は不要になりました。 お手数おかけしすみません。
guest

回答1

0

自己解決

こちらダイレクトメッセージ機能は別の方法で実装することにしたので、エラーの解決は不要になりました。

投稿2023/05/09 00:58

AIR11451481019

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問