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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1272閲覧

【Rails】DM一覧ページでエラーが表示される

punchan36

総合スコア105

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/03/03 07:30

編集2020/03/08 22:50

前提・実現したいこと

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

@anotherEntries = Entry.where(room_id: myRoomIds).where('user_id != ?', @user.id)

上記で**where('user_id != ?', @user.id)**とありますが
indexアクション内で@userが定義されていないためのエラーになっているようです。
適切な@userを設定するのがいいかなーと思います

投稿2020/03/09 20:08

H4L

総合スコア88

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

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

punchan36

2020/03/10 03:32

「@user = @current_user」を入れ忘れておりました…。 無事表示されました。初歩的な部分で申し訳ありませんでした。 ご回答有難うございます!
guest

0

Railsはルーティングをconfig/routes.rbにて設定します
一つ一つのURLに応じたルーティングを施す場合、
get '/index' => 'post#index'
といった風に書きます
上記は、
http//localhost:3000/indexへgetリクエストを受けた時に
post_controllerのindexアクションを実行,
railsが自動でアクションと同名のview(index.html.erb)を呼び出す、
という一連の流れを定めています

一個一個ルーティングするのは面倒なので、
resources :XXX みたいに
resourcesでRailsに自動で主要なルーティング(RESTful)を生成させる書き方もあります

リンクに関しては、
<%= link_to 'ルート', root_path %>
のようにURLに対応した名前付きルートで書くのが多分一般的です。
コンソールでrails routesを実行した際のPrefix欄に表示されているのが名前付きルートです

投稿2020/03/05 21:18

編集2020/03/05 21:25
H4L

総合スコア88

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

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

punchan36

2020/03/06 04:18

ご回答有難うございます! 申し訳ありません。routes.rbを載せ忘れておりましたので追記致しました。 resources :rooms, :only => [:create, :show, :index] ルーティングはこのように書いており、その上で「http://localhost:3000/rooms/index」に飛ぶとエラーメッセージが表示されます(エラーメッセージも追記させて頂きました)。 ルーティング、もしくはどこかのコードが間違っているのでしょうか…。
punchan36

2020/03/08 08:32

はい、間違いありません。表示したいページは「index」ですが、なぜかコントローラの「show」の部分でエラー表示が出てしまいます…。
punchan36

2020/03/08 22:53

H4Lさま その後、ルーティングの編集に関して進展がありましたので追記致しました。 見て頂けると有難いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問