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

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

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

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

Ruby on Rails 6

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

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

1535閲覧

Couldn't find Room with 'id'=[1, 4] エラー

tomsuma

総合スコア38

Ruby

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

Ruby on Rails 6

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

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/08/14 11:25

編集2020/08/14 12:55

初心者です。。

やりたいこと
メルカリの取引メッセージ画面のような
指定したの商品のメッセージ画面を作りたい

現状
三層ネスト構造でのルーム作成からのメッセージのやり取りがどうやってやるのかわからず
メッセージ画面に飛ぶ際にエラーが起きる

Couldn't find Room with 'id'=[1, 4]

聞きたいこと
このような場合データベース設計から見直したほうがいいのか
また、三層ネスト構造が可能であるのならばどうやってやればいいのかを知りたい

エラー部 ( message index) class MessagesController < ApplicationController def index @room =Room.find(params[:room_id])  ←ここの表記 ids にしてもダメでした @book = Book.find(params[:book_id]) @message =Message.all end def new @room = Room.find(params[:room_id]) @book = Book.find(params[:book_id]) @message = Message.new end
book index画面からメッセージ画面に飛ぶ予定です <li class ="btn5"><%= link_to "ロームで会話する?","/books/#{@book.ids}/rooms/#{@room.ids}/messages" %></li><br/>
bookコントローラー def index @books =Book.all @book =Book.includes(:room,:user) @room = @book.includes(:room) set_book_column end
ルーティング resources :books do resources :rooms, only: [:new, :create,:index] do resources :messages,only: [:create, :new,:index,:show] end end
book.rb   belongs_to :user has_one :room, dependent: :destroy has_many :message, dependent: :destroy message.rb belongs_to :user, optional: true belongs_to :book, optional: true belongs_to :room, optional: true room_user.rb  値が入っている belongs_to :room, optional: true belongs_to :user, optional: true room.rb   値が入っている belongs_to :book, optional: true has_many :messages, dependent: :destroy has_many :room_users has_many :users, through: :room_users user.rb  has_many :messages has_many :books, dependent: :destroy has_many :room_users has_many :rooms, through: :room_users

何日も解決してません
足りない情報がありましたら
お声掛けお願いします、、

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

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

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

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

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

guest

回答2

0

ベストアンサー

やりたいことに対して知識が浅く、一度の回答では厳しいと思われるので、方針だけ回答書きます。

三層ネスト構造が可能であるのならばどうやってやればいいのかを知りたい

ネストは深くても実現可能です。

<li class ="btn5"><%= link_to "ロームで会話する?","/books/#{@book.ids}/rooms/#{@room.ids}/messages" %></li><br/>

を見る限り、
ここで気になるのは/books/[1,4] というURLを想定しているのか、いないのか。私の経験上、見たことないので、一般的ではないのではないかと。
一般的によく見受けられるのは/books/1や/books/4などだと思います。
ネストの深さの問題ではなく、URLとparamsの関係性だったり、RESTだったりなど理解されていないのではないかと思います。
下記のURLを一読していただき、まずは理解された方がいいと思います。
https://railsguides.jp/routing.html

その上でネストするかどうかみたいな話になると思います。

実際、やりたいことを実装していくにあたっては、下記の流れになるのかなと。ここは人それぞれなのと、仕様にもよりますが。細かいところが違ってたらすいません。

・[View][/booksもしくは/books/:id] /books/:book_id/rooms(method: post) というリンクをクリック
・[Controller][rooms#create]Bookごとのルームを作成し、/rooms/:room_id/messages/newにリダイレクト
・[View][/rooms/:room_id/messages/new]/rooms/:room_id/messages(method:post)のフォームを用意する
・[Controller][messages#create]ルームごとのメッセージを作成, /rooms/:room_id/messages/new

room_usersは用途不明なので、考慮しませんでした。
発言者とかが必要ということだと思いますが、1:1のメッセージの想定だと思うので、それであれば、roomに出品者_user_idや質問者_user_id、messageに発言者_user_idなどのカラム追加して実装したほうがシンプルでいいと思います。
この辺りもポリモーフィズムを用いたりした方がいいような気もしますが、一度に色々やるよりは一つずつやっていき、リファクタを重ね最後に理解したほうがいいと思うので、かきません。

投稿2020/08/14 13:01

Cojiro

総合スコア539

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

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

tomsuma

2020/08/14 13:10

kojiro様 大変丁寧な対応ありがとうございます!! かしこまりました。 再び見直した上でやり直させてもらいます! 参考記事までありがとうございました!
guest

0

<li class ="btn5"><%= link_to "ロームで会話する?","/books/#{@book.id}/rooms/#{@room.id}/messages" %></li><br/>

ids => id

投稿2020/08/14 12:38

nasuk47

総合スコア311

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

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

tomsuma

2020/08/14 12:54

ご回答ありがとうございます!! undefined method `id' for #<Book::ActiveRecord_Relation:0x00007ff4ae246ee0> Did you mean? ids このようにするとこのようなエラーが出てしまいます、、
nasuk47

2020/08/14 13:03

@bookにはBookモデルのインスタンスが入っているのではないのですか? @bookはどこで定義していますか?
tomsuma

2020/08/14 13:08

bookコントローラー def index @books =Book.all @book =Book.includes(:room,:user) @room = @book.includes(:room) set_book_column end のようにindexで定義させてもらっています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問