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

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

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

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

Ruby on Rails

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

Q&A

解決済

3回答

2414閲覧

indexから送られてくるshowアクションのidの中身が、indexとなっておりエラーが出ます。助けてください。

nomuno

総合スコア4

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/02 09:35

編集2020/09/02 11:54

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
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

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

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

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

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

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

Cojiro

2020/09/02 11:48

どういうURLにアクセスしようとしたときにこのエラーは発生していますか?
nomuno

2020/09/02 11:53

http://localhost:3000/rooms/index 上記のURLに遷移しようとしたら、今回のようなエラーが出てきます。 何か思い当たる節ありましたら、ご教示いただけると助かります。 よろしくお願いします。
guest

回答3

0

indexページに遷移したいということですよね?

http://localhost:3000/rooms/index

にアクセスしたらshowアクションになると思います。

indexアクションに接続したければ、/rooms/ です。
利用するヘルパーは、rooms_pathです。

投稿2020/09/02 12:11

Cojiro

総合スコア539

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

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

Cojiro

2020/09/02 12:12

あ、解決してましたね。良かったです。
nomuno

2020/09/02 12:47

はい、無事に解決に至りました。 ご協力ありがとうございました!!
guest

0

ベストアンサー

もしかして、/rooms/indexへアクセスしていたりはしないでしょうか?

標準のresourcesで作られるRoutingの場合、indexアクションへアクセスするためのURLは/roomsです。

/rooms/indexはエラーのとおり、Rooms#showid=indexとして処理されます。

投稿2020/09/02 12:01

maisumakun

総合スコア145183

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

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

maisumakun

2020/09/02 12:02

追記部分を読み落としていましたが、そのとおりだったようですね。
nomuno

2020/09/02 12:06

おっしゃる通りのことをしておりました。 神解答ありがとうございます。 おかげさまで、理解を深めることができました。 ありがとうございました!!
maisumakun

2020/09/02 12:13

他に「/rooms/***」のようなRoutingを追加したい場合も、resources :roomsより先に書かないと、showに流れてしまうので要注意です。
nomuno

2020/09/02 12:49

そうなのですね!! より深いところまで教えていただきありがとうございます!! 今後にしっかりと活かしていきます!!
guest

0

room_path(room.id)

showは一つのデータなので単数になります。
ターミナルでrails routesを実行するとshowアクションに飛ばすpathの記述が確認できます。

投稿2020/09/02 11:47

nasuk47

総合スコア311

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

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

nomuno

2020/09/02 11:52

解答していただきありがとうございます。 ご指摘箇所、おっしゃる通り、単数形でした。 ですが、修正後も変わらず同じエラーが出てきます。 もし他にも思い当たる節がありましたら、ご教示いただけると助かります。
nasuk47

2020/09/02 11:55

showに遷移した時にbinding,pryで止めてparamsと入力して内容を確認してみてください
nomuno

2020/09/02 12:08

丁寧に協力していただきありがとうございます。 無事問題が解決いたしました。 原因はパスの指定にindexを含んでいることでした。 ありがとうございました!!
nasuk47

2020/09/02 12:16

よかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問