質問内容
Railsで宿泊予約サイトを作成中の者です。
【実現したい流れ】
①ルーム詳細ページからformでパラメータ入力後
②次のページ(確認ページ)へ値を渡す
③登録ボタンでcreateアクションを実行
④Reservationモデルへ登録し予約詳細ページへ遷移する
困っていること
ルーム詳細ページから遷移先へ値を渡すことはできたのですが、
登録する際にメソッドが存在しないと言われる。
お知恵をお知恵をおかしいただける幸いです。
エラーメッセージ
該当のソースコード
Ruby
1# routes.rb 2Rails.application.routes.draw do 3 devise_for :users 4 5 # トップページのルーティング 6 root 'top#index' 7 8 resources :users, only:[:show, :edit, :update] do 9 collection do 10 # URLにidをつけない 11 get 'account', action: :show 12 get 'profile', action: :edit 13 end 14 end 15 16 # ネスト 17 resources :rooms, only:[:index, :new, :create, :show] do 18 resources :reservations, only:[:new, :create, :show] 19 # newアクションのpostを作成 20 match '/reservations/new', to: 'reservations#new', via: 'post' 21 end 22end 23
Ruby
1# reservations_controller.rb 2class ReservationsController < ApplicationController 3 def new 4 @reservation = Reservation.new 5 @room = Room.find(params[:room_id]) 6 end 7 8 def create 9 @reservation = Reservation.new(reservation_params) 10 # room_idの情報はフォームから送られないので、deviseのメソッドで追加 11 @reservation.room_id = current_user.id 12 if @reservation.save 13 redirect_to root_path 14 else 15 render :new 16 end 17 end 18 19 def show 20 @reservation = Reservatio n.find(params[:id]) 21 @room = Room.find(params[:room_id]) 22 end 23 24 private 25 26 def reservation_params 27 params.require(:reservation).permit(:start_date, :end_date, :people, :total_money).merge(room_id: params[:room_id]) 28 end 29end
HTML
1# views/rooms/show.html.erb 2<div class='wrapper'> 3 <div class="room-show"> 4 <div class="room-show-inner"> 5 <div class="room-detail"> 6 <div class="room-image"> 7 <%= image_tag @room.image.url %> 8 </div> 9 <div class="room-show-profile"> 10 <%# 後ほど変更(ルーム登録者の画像に変更) %> 11 <%= image_tag 'default.png', size: '80x80', class: 'rounded-circle' %> 12 <div> 13 <h3><%= @room.name %></h3> 14 <p><%= @room.address %></p> 15 </div> 16 </div> 17 <p class='room-show-introduction'><%= @room.introduction %></p> 18 </div> 19 20 <div class="room-show-reservation"> 21 <div class="reservation-flex"> 22 <p>¥<%= @room.money %>/日</p> 23 <%= form_with url: new_room_reservation_path(@room), local: true do |f| %> 24 <div class="form-group"> 25 <%= f.label :start_date, '開始日' %> 26 <%= f.date_field :start_date, autofocus: true, class: 'form-control' %> 27 </div> 28 <div class="form-group"> 29 <%= f.label :end_date, '終了日' %> 30 <%= f.date_field :end_date, class: 'form-control' %> 31 </div> 32 <div class="form-group"> 33 <%= f.label :people, '宿泊人数' %> 34 <%= f.number_field :people, class: 'form-control' %> 35 </div> 36 <div> 37 <%= f.submit '予約する', class: 'btn btn-primary btn-block text-center' %> 38 </div> 39 <% end %> 40 </div> 41 </div> 42 </div> 43 </div> 44</div>
HTML
1# views/reservations/new.html.erb 2<div class="wrapper"> 3 <div class="reservation-new"> 4 <div class="reservation-new-inner"> 5 <h2>予約内容確認</h2> 6 <p class='room-money'>¥<%= @room.money %>/日</p> 7 8 <%= form_with model: [@room, @reservation], url: room_reservations_path, local: true do |f| %> 9 <div class="form-group"> 10 <%= f.label '開始日' %> 11 <%= f.date_field :start_date, class: 'form-control', readonly: true, value: params[:start_date] %> 12 </div> 13 <div class="form-group"> 14 <%= f.label '終了日' %> 15 <%= f.date_field :end_date, class: 'form-control', readonly: true, value: params[:end_date] %> 16 </div> 17 18 <%# 文字列からdate型に変換後、date型は普通に計算式でOK 有理数が返るからnumeratorメソッド %> 19 <p class='room-day'>使用日数:<%= (params[:end_date].to_date - params[:start_date].to_date).numerator %>日</p> 20 21 <p class='room-people'>人数:<%= params[:people] %>人</p> 22 <div class="form-group"> 23 <%= f.label '合計金額' %> 24 <%= f.number_field :total_money, class: 'form-control', readonly: true, value: params[:people].to_i * @room.money %> 25 </div> 26 27 <p class='confirmed'>上記内容でよろしければ「予約確定」を押してください</p> 28 29 <div class='check'> 30 <%= f.submit '予約を確定', class: 'btn btn-primary btn-block text-center' %> 31 <%= link_to 'ルーム詳細に戻る', account_users_path, class: 'btn btn-secondary' %> 32 </div> 33 <% end %> 34 </div> 35 </div> 36</div>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/15 07:10