前提
予約機能を実装するにあたり、モデルを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
-
うまく情報を伝達するにはどうすれば良いでしょうか。
-
また、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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。