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

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

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

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

Ruby on Rails

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

242閲覧

Ruby on rails 予期せぬ値が取得されて処理が失敗する

nao_sss

総合スコア1

Ruby

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

Ruby on Rails

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

1グッド

0クリップ

投稿2024/12/12 03:14

編集2024/12/13 10:08

実現したいこと

現在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が引数に指定されているということまでしかわからず原因がわからない状態です。
何卒お力添えをいただけますと幸いです。

補足

特になし

AKYM👍を押しています

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

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

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

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

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

maisumakun

2024/12/12 06:49

def confirmにいきなりある、@reservationはどのように取得していますでしょうか。 before_actionや何かしらのgemを利用しているのであれば、そのあたりもご提示ください。
nao_sss

2024/12/13 09:58

maisumakun様 ご回答いただきありがとうございます。 また記載漏れがあったようで大変失礼いたしました、before actionについては以下を定義しております。 before_action :set_room, only: [:new, :create] before_action :set_reservation, only: [:show, :destroy] before_action :authenticate_user!
nao_sss

2024/12/13 10:07

また重複となり恐縮ですがconfirmメソッドとして以下を定義しております。 # 予約確定処理 def confirm if @reservation.update(confirmed: true) redirect_to reservations_path, notice: "予約が確定しました。" else flash[:alert] = "予約確定に失敗しました。" render :confirmation, status: :unprocessable_entity end end またreservation_controllerにつきまして全文をあらためて掲載させていただきました。 よろしければ引き続きご教授のほど何卒よろしくお願いいたします。
maisumakun

2024/12/13 10:19

> before actionについては以下を定義しております。 confirmではどれも動かないです。
nao_sss

2024/12/19 03:47

ご回答いただきありがとうございます。 こちら私の方で before_action :set_reservationでconfirmを許可などしたところ問題なく予約が完了いたしました。 お忙しいところお手数をおかけし恐縮です、またよろしければご助力を頂けますと幸いです。
guest

回答1

0

ベストアンサー

undefined method `update' for nil:NilClassと出ていますが、このエラーは「nilに対してメソッドを呼び出した」という意味であり、つまりレシーバーの@reservationnilということです。

Railsでは、コントローラーはリクエストごとにインスタンスが生成されるので、前のリクエストで@reservationに代入した値が自動で引き継がれることはありません。特に代入しなければ、インスタンス変数はnilとなります。

投稿2024/12/12 07:17

maisumakun

総合スコア146018

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

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

maisumakun

2024/12/12 07:32

> reservation_contrrollerに記載のconfirmメソッドで値を取得している認識なのですが 掲載された範囲でそのようなコードは見当たりません。なんの処理もせずに@reservationを参照すれば、値はnilです。
winterboum

2024/12/13 08:36

confirmメソッドで値を取得 しても、createメソッドが呼ばれるときには消えています。 maisumakunさんが書かれているように、ブラウザーからのリクエスト毎に controllerインスタンスは作り直されますから
nao_sss

2024/12/13 10:05 編集

maisumakun様 ご回答いただきありがとうございます。 また記載漏れがあったようで大変失礼いたしました、 「@reservationに代入した値が引き継がれない」という認識が抜けておりご指摘いただき大変幸甚に存じます。 confirmメソッドには以下の処理を記述しております。 よろしければ何卒ご確認を頂けますと幸いです。 # 予約確定処理 def confirm if @reservation.update(confirmed: true) redirect_to reservations_path, notice: "予約が確定しました。" else flash[:alert] = "予約確定に失敗しました。" render :confirmation, status: :unprocessable_entity end end
nao_sss

2024/12/13 10:02

winterboum様 ご回答いただきありがとうございます。 お手数をおかけし大変恐縮です、またご指摘いただきありがとうございます。 私の方でインスタンスに関する認識が抜けており大変勉強になります。 よろしければまたご教授を頂けますと幸いです。
maisumakun

2024/12/13 10:23 編集

> confirmメソッドには以下の処理を記述しております。 もとの回答のとおり、@reservationに対する代入は行われていないですし、追記されたbefore_actionにも存在しません。 先に@reservation = (Reservationを検索するコード)のようなものを実行しないといけないですが、それが見当たらないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問