実現したいこと
現在Ruby on railsで宿泊予約アプリを作成しているものです。
実装したい内容としては
・施設詳細画面にて「予約する」ボタンを押下
・予約確認画面に遷移し「予約確定」ボタンを押下した際に予約が完了する
というものです。
発生している問題・分からないこと
現在施設詳細画面は引数として存在する施設の値が指定されるように実装したため表示できている(http://localhost:3000/rooms/1)のですが、
予約確認画面に遷移すると存在しない施設の値が引数に指定され「予約を確定」ボタンを押下しても存在しない施設IDが値として指定されるためエラーとなっている状態です。(http://localhost:3000/reservations/29)
reservation_contrrollerに記載のconfirmメソッドで値を取得している認識なのですが、下記のcreateメソッドとなにか競合する部分があるのか、そもそも上記の存在しない組織IDはどこから渡されているのかなど調べているのですが原因がわからない状態です。
エラーメッセージ
error
1NoMethodError in ReservationsController#confirm 2undefined method `update' for nil:NilClass 3Extracted source (around line #43): 441 542 643 744 845 946 10 11 # 予約確定処理 12 def confirm 13 if @reservation.update(confirmed: true) 14 redirect_to reservations_path, notice: "予約が確定しました。" 15 else 16 flash[:alert] = "予約確定に失敗しました。" 17 18Rails.root: /Users/sunao/reservation_manager 19 20Application Trace | Framework Trace | Full Trace 21app/controllers/reservations_controller.rb:43:in `confirm'
該当のソースコード
Ruby
1class ReservationsController < ApplicationController 2 before_action :set_room, only: [:new, :create] 3 before_action :set_reservation, only: [:show, :destroy] 4 before_action :authenticate_user! 5 6 # 予約一覧 7 def index 8 @reservations = current_user.reservations.includes(:room) 9 end 10 11 # 予約確認ページ 12 def show 13 end 14 15 # 新規作成フォーム 16 def new 17 @reservation = Reservation.new 18 @room = Room.find(params[:room_id]) 19 end 20 21 # 作成処理 22 def create 23 @room = Room.find(params[:room_id]) 24 @reservation = current_user.reservations.new(reservation_params) 25 @reservation.room = @room 26 27 if @reservation.save 28 redirect_to @reservation, notice: "予約が確定しました。" 29 else 30 flash.now[:alert] = "予約に失敗しました。入力内容をご確認ください。" 31 render :new 32 end 33 end 34 35 # 予約削除 36 def destroy 37 @reservation.destroy 38 redirect_to reservations_path, notice: "予約を削除しました。" 39 end 40 41 # 予約確定処理 42 def confirm 43 if @reservation.update(confirmed: true) 44 redirect_to reservations_path, notice: "予約が確定しました。" 45 else 46 flash[:alert] = "予約確定に失敗しました。" 47 render :confirmation, status: :unprocessable_entity 48 end 49 end 50 51 52 53 private 54 55 def set_room 56 @room = Room.find(params[:room_id]) 57 end 58 59 def set_reservation 60 @reservation = current_user.reservations.find_by(id: params[:id]) 61 unless @reservation 62 redirect_to reservations_path, alert: "予約が見つかりませんでした。" 63 end 64 end 65 66 def reservation_params 67 params.require(:reservation).permit(:check_in_date, :check_out_date, :number_of_guests) 68 end 69 end 70 71
Ruby
1 # 作成処理 2 def create 3 @room = Room.find(params[:room_id]) 4 @reservation = current_user.reservations.new(reservation_params) 5 @reservation.room = @room 6 7 if @reservation.save 8 redirect_to @reservation, notice: "予約が確定しました。" 9 else 10 flash.now[:alert] = "予約に失敗しました。入力内容をご確認ください。" 11 render :new 12 end 13 end
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
ChatGPTにエラーメッセージを入力して対応を調べたのですが存在しない施設のIDが引数に指定されているということまでしかわからず原因がわからない状態です。
何卒お力添えをいただけますと幸いです。
補足
特になし
回答1件
あなたの回答
tips
プレビュー