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

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

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

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

Q&A

解決済

1回答

1073閲覧

複数のモデルのコントローラ内でのparamsの受け渡しがうまくいきません。

kytm

総合スコア11

Ruby on Rails

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

0グッド

0クリップ

投稿2021/11/18 07:35

前提

予約機能を実装するにあたり、モデルをreservationとして作成しました。

class Reservation < ApplicationRecord belongs_to :user belongs_to :room validates :start_date, presence: true validates :end_date, presence: true validates :number_of_people, presence: true validates :total_cost, presence: true end

そして、reservationモデルはユーザーとルームモデルと関連づけてあります。

実現したいこと

<view/rooms/show.html.erb> でルームのshowページに
下記画像のように開始日、終了日、人数を入力させる画面を表示しています。

イメージ説明

その際、予約ができなかった場合は再度同じshowページにrenderします。

問題

しかしエラーが発生し、再度同じshowページにrenderすることができません。
<views/rooms/show.html.erb>

<h2>Showページ</h2> <%= @room.name %> <div> <%= form_for(@reservation) do |f| %> <%= f.label "開始日" %> <%= f.date_field :start_date %> <%= f.label "終了日" %> <%= f.date_field :end_date %> <%= f.label "人数" %> <%= f.number_field :number_of_people %> <%= f.submit "登録" %> <% end %> </div>

reservationsコントローラのcreateアクションが反応する際に、@roomの情報を見失ってしまわないように
@roomの情報を保存するように下記のように行いました。
@room = current_user.rooms.find(params[:id])

<reservations_controller.rb>

class ReservationsController < ApplicationController def new @reservation = current_user.reservations.new end def create @reservation = current_user.reservations.build(reservation_params) @room = current_user.rooms.find(params[:id]) if @reservation.save #success else render 'rooms/show' end end private def reservation_params params.require(:reservation).permit(:start_date, :end_date, :number_of_people, :total_cost) end end

しかしうまく保存ができていないのか、エラー内容は下記のようになりました。

Couldn't find Room without an ID Extracted source (around line #9): 7 8 9 10 11 12 def create @reservation = current_user.reservations.build(reservation_params) @room = current_user.rooms.find(params[:id]) if @reservation.save #success
  1. うまく情報を伝達するにはどうすれば良いでしょうか。

  2. また、paramsの構造についても教えていただきたいです。以下はparamsについての上記への補足質問です。

showページには
@roomインスタンスと、@reservationインスタンスが存在していて、

<%= f.submit "登録" %>

を押すと、/reservaionsにPOSTリクエストを送信されます。

その際はparamsメソッドの中には/reservaionsに関する情報しか取り扱ってくれないということでしょうか?
だからreservationコントローラのcreateアクションの中で
@room = current_user.rooms.find(params[:id])
を行ってもそもそもparamsにはreservarionsの情報しかのっていないから
findができないということでしょうか。

<roomsコントローラ>

def show @room = current_user.rooms.find(params[:id]) @reservation = current_user.reservations.new end

<rooms/show.html.erb>

<h2>Showページ</h2> <%= @room.name %> <div> <%= form_for(@reservation) do |f| %> <%= f.label "開始日" %> <%= f.date_field :start_date %> <%= f.label "終了日" %> <%= f.date_field :end_date %> <%= f.label "人数" %> <%= f.number_field :number_of_people %> <%= f.submit "登録" %> <% end %> </div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

params[:id] は通常パスに含まれます。

/rooms/23 なら params[:id] は 23 です。
/reservations では nil です。

room の id を受け取るには「パスに含める」か「フォームに埋め込む」です。

パスに含める

config/routes.rb で以下のようにネストさせるとPOST /rooms/:room_id/reservationなどが生成され、ReservationsController では params[:room_id] で room の id を受け取れます。

ruby

1resources :rooms do 2 resources :reservations 3end

送信するフォームは以下のようになります。

erb

1<%= form_with(model: [@room, @reservation]) do |f| %>

フォームに埋め込む

hidden_field に @room の id を指定します。
params[:room_id] で受け取れます。

erb

1 <%= form_for(@reservation) do |f| %> 2 <%= f.hidden_field :room_id, value: @room.id %> 3 4 <%= f.label "開始日" %> 5 <%= f.date_field :start_date %> 6 7 <%= f.label "終了日" %> 8 <%= f.date_field :end_date %> 9 10 <%= f.label "人数" %> 11 <%= f.number_field :number_of_people %> 12 13 <%= f.submit "登録" %> 14 <% end %>

投稿2021/11/18 09:03

neko_daisuki

総合スコア2090

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問