前提・実現したいこと
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
class RoomsController < ApplicationController
def create
@room = Room.create
@entry1 = Entry.create(:room_id => @room.id, :user_id => @current_user.id)
@entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(:room_id => @room.id))
redirect_to "/rooms/#{@room.id}"
end
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
@entries = @room.entries
else
redirect_back(fallback_location: root_path)
end
end
def index
@currentEntries = @current_user.entries
myRoomIds = []
@currentEntries.each do | entry |
myRoomIds << entry.room.id
end
@anotherEntries = Entry.where(room_id: myRoomIds).where('user_id != ?', @user.id)
end
end
rooms#index.html.erb
<% @anotherEntries.each do |e| %>
<%= Message.find_by(id: e.room.message_ids.last).content %>
<% end %>
routes.rb
Rails.application.routes.draw do
post "likes/:post_id/create" => "likes#create"
post "likes/:post_id/destroy" => "likes#destroy"
get "login" => "users#login_form"
post "login" => "users#login"
post "logout" => "users#logout"
post "users/:id/update" => "users#update"
get "users/:id/edit" => "users#edit"
post "users/create" => "users#create"
get "signup" => "users#new"
get 'users/index' => 'users#index'
get "users/:id" => "users#show"
get "users/:id/follow" => "users#follow"
get "/" => "users#top"
post "users/:id/destroy" => "users#destroy"
get 'posts/index'=> 'posts#index'
get "posts/new" => "posts#new"
get "posts/:id" => "posts#show"
post "posts/create" => "posts#create"
get "posts/:id/edit" => "posts#edit"
post "posts/:id/update" => "posts#update"
post "posts/:id/destroy" => "posts#destroy"
get "posts/search" => "posts#search"
get 'about/about'
get 'home/top' => 'home#top'
get 'top' => 'home#top'
get 'about' => 'about#about'
resources :users do
member do
get :following, :followers, :users_tweets
end
end
resources :relationships, only: [:create, :destroy]
resources :messages, :only => [:create]
resources :rooms, :only => [:create, :show, :index]
その後、試したこと
上記の質問をさせて頂いてから、数日が経過しました。
「rooms/index」に飛んでいるにも関わらず「RoomsController#show」でエラーが発生している点がおかしいと思い調べた所、
resourcesでルーティングを定義した場合のエラーについてこちらに書かれていた為、参考にして以下の様にルーティングを変更しました。
resources :rooms, :only => [:create, :show, :index]
↓
get 'rooms/index' => 'rooms#index'
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
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
@anotherEntries = Entry.where(room_id: myRoomIds).where('user_id != ?', @user.id)
上記でwhere('user_id != ?', @user.id)とありますが
indexアクション内で@userが定義されていないためのエラーになっているようです。
適切な@userを設定するのがいいかなーと思います
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
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欄に表示されているのが名前付きルートです
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/03/10 12:32
無事表示されました。初歩的な部分で申し訳ありませんでした。
ご回答有難うございます!