前提・実現したいこと
Ruby on Railsでこちらのページ等を参考にメッセージ機能を作りました。上手く実装できたので次に各ユーザーが受け取った「DM一覧ページ」を作っているところです。こちらのページを参考にしています。
しかしルーティングの設定の仕方が悪いのか、エラーが表示されてしまいます。
どなたかお知恵を拝借頂けると幸いです。
発生している問題・エラーメッセージ
ActiveRecord::RecordNotFound in RoomsController#show Couldn't find Room with 'id'=index Extracted source (around line #10): def show **@room = Room.find(params[:id])** if Entry.where(:user_id => @current_user.id, :room_id => @room.id).present? @messages = @room.messages @message = Message.new
rooms_controller.rb
Ruby
1class RoomsController < ApplicationController 2 def create 3 @room = Room.create 4 @entry1 = Entry.create(:room_id => @room.id, :user_id => @current_user.id) 5 @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(:room_id => @room.id)) 6 redirect_to "/rooms/#{@room.id}" 7 end 8 9 def show 10 @room = Room.find(params[:id]) 11 if Entry.where(:user_id => @current_user.id, :room_id => @room.id).present? 12 @messages = @room.messages 13 @message = Message.new 14 @entries = @room.entries 15 else 16 redirect_back(fallback_location: root_path) 17 end 18 end 19 20 def index 21 @currentEntries = @current_user.entries 22 myRoomIds = [] 23 24 @currentEntries.each do | entry | 25 myRoomIds << entry.room.id 26 end 27 28 @anotherEntries = Entry.where(room_id: myRoomIds).where('user_id != ?', @user.id) 29 end 30end
rooms#index.html.erb
Ruby
1<% @anotherEntries.each do |e| %> 2 <%= Message.find_by(id: e.room.message_ids.last).content %> 3<% end %>
routes.rb
Ruby
1Rails.application.routes.draw do 2 post "likes/:post_id/create" => "likes#create" 3 post "likes/:post_id/destroy" => "likes#destroy" 4 5 get "login" => "users#login_form" 6 post "login" => "users#login" 7 post "logout" => "users#logout" 8 9 post "users/:id/update" => "users#update" 10 get "users/:id/edit" => "users#edit" 11 post "users/create" => "users#create" 12 get "signup" => "users#new" 13 get 'users/index' => 'users#index' 14 get "users/:id" => "users#show" 15 get "users/:id/follow" => "users#follow" 16 get "/" => "users#top" 17 post "users/:id/destroy" => "users#destroy" 18 19 get 'posts/index'=> 'posts#index' 20 get "posts/new" => "posts#new" 21 get "posts/:id" => "posts#show" 22 post "posts/create" => "posts#create" 23 get "posts/:id/edit" => "posts#edit" 24 post "posts/:id/update" => "posts#update" 25 post "posts/:id/destroy" => "posts#destroy" 26 get "posts/search" => "posts#search" 27 28 get 'about/about' 29 get 'home/top' => 'home#top' 30 get 'top' => 'home#top' 31 get 'about' => 'about#about' 32 33 resources :users do 34 member do 35 get :following, :followers, :users_tweets 36 end 37 end 38 resources :relationships, only: [:create, :destroy] 39 40 resources :messages, :only => [:create] 41 resources :rooms, :only => [:create, :show, :index]
その後、試したこと
上記の質問をさせて頂いてから、数日が経過しました。
「rooms/index」に飛んでいるにも関わらず「RoomsController#show」でエラーが発生している点がおかしいと思い調べた所、
resourcesでルーティングを定義した場合のエラーについてこちらに書かれていた為、参考にして以下の様にルーティングを変更しました。
Ruby
1 resources :rooms, :only => [:create, :show, :index] 2 ↓ 3 get 'rooms/index' => 'rooms#index' 4 resources :rooms, :only => [:create, :show]
すると「RoomsController#index」をしっかりと読み込んでくれました。
しかし今度は「RoomsController#index」内で以下のエラーが発生しました。
NoMethodError in RoomsController#index undefined method `id' for nil:NilClass Extracted source (around line #28): @anotherEntries = Entry.where(room_id: myRoomIds).where('user_id != ?', @user.id) end end
自分でも解決に向け色々と調べておりますが、どなたか原因が分かる方がいらっしゃれば教えて頂けると有難いです。
補足情報(FW/ツールのバージョンなど)
ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/10 03:32