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

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

ただいまの
回答率

88.19%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 474

punchan36

score 61

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/10 12:32

    「@user = @current_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欄に表示されているのが名前付きルートです

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/06 13:18

    ご回答有難うございます!
    申し訳ありません。routes.rbを載せ忘れておりましたので追記致しました。

    resources :rooms, :only => [:create, :show, :index]
    ルーティングはこのように書いており、その上で「http://localhost:3000/rooms/index」に飛ぶとエラーメッセージが表示されます(エラーメッセージも追記させて頂きました)。

    ルーティング、もしくはどこかのコードが間違っているのでしょうか…。

    キャンセル

  • 2020/03/07 19:31

    エラーメッセージはrooms_controller#showを指していますが、
    http://localhost:3000/rooms/indexへ飛んだ時のエラーで間違いないでしょうか?

    キャンセル

  • 2020/03/08 17:32

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

    キャンセル

  • 2020/03/09 07:53

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

    キャンセル

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

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る