前提・実現したいこと
ここに質問の内容を詳しく書いてください。
Ruby on Railsでチャットアプリを作っています。
テーブルは以下の四つです
①ユーザーテーブル
②ルームテーブル
③メッセージテーブル
④ルームとユーザーの中間テーブル
ルームコントローラーのindexアクションとshowアクションの機能を実装しておりました。
その過程で、incexのビューページにshowアクションのページに遷移するためのリンクを記述しています。
indexの記述に問題はなさそうなのですが、rooms_controllerのshowアクションのidの中身がindexとなってますという、エラーメッセージが発生しました。
index.html.erbのビューページにアクセスしようとすると、以下のようなエラーメッセージがでます。
どうしてこのようなことが起きるのかについて教えていただきたいです。
発生している問題・エラーメッセージ
Couldn't find Room with 'id'=index Extracted source (around line #22): def show @room = Room.find(params[:id]) @messages = @room.messages.includes(:user).order(:id).last(100) @message = current_user.messages.build end
rooms_controller.rb
ruby
1class RoomsController < ApplicationController 2 3 def index 4 @rooms = Room.all.order(:id) 5 end 6 7 def new 8 @room = Room.new 9 @room.users << current_user 10 end 11 12 def create 13 @room =Room.new(room_params) 14 if @room.save 15 redirect_to root_path 16 else 17 render :new 18 end 19 end 20 21 def show 22 @room = Room.find(params[:id]) #この行がエラーメッセージの対象となっています。 23 @messages = @room.messages.includes(:user).order(:id).last(100) 24 @message = current_user.messages.build 25 end 26 27 def show_additionally 28 last_id = params[:oldest_message_id].to_i - 1 29 @messages = Message.includes(:user).order(:id).where(id: 1..last_id).last(50) 30 end 31 32 private 33 34 def room_params 35 params.require(:room).permit(:name).merge(user_ids: current_user.id) 36 end 37end
index.html.erb
ruby
1class RoomsController < ApplicationController 2<div class="room_index_main"> 3 <ul class="family_lists"> 4 <% @rooms.each do |room| %> 5 <li class="family_list"><%= link_to "#{room.name}", room_path(room.id), class:"family_button" %></li> 6 <% end %> 7 </ul> 8</div>
new.html.erb
ruby
1<div id="message-container" data-room_id = "<%= @room.id %>"> 2 <%= render @messages %> 3</div> 4<%= render 'footer' %>
routes.rb
ruby
1Rails.application.routes.draw do 2 mount ActionCable.server => "/cable" 3 resources :rooms, only: [:index, :new, :show, :create, :update] do 4 resources :messages, only: [:create] 5 end 6 root to: "users#show" 7 8 9 devise_for :users, controllers: { 10 registrations: "users/registrations", 11 sessions: "users/sessions" 12 } 13 resources :users, only: [:show] 14 15 16 get "/show_additionally", to: "rooms#show_additionally" 17 18 devise_scope :user do 19 get "sign_in", to: "users/sessions#new" 20 get "sign_out", to: "users/sessions#destroy" 21 end 22end
試したこと
- root_pathをindexからshowに変更
- index.html.erbの引数として渡すroomをroom.idにしてみた
- rooms_controllerの(params[:id])を(:id room.id)にしてみた
補足情報(FW/ツールのバージョンなど)
- Ruby ver 2.6.5
- Rails ver 6.0.0
回答3件
あなたの回答
tips
プレビュー