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

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

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

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

Ruby on Rails 6

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Q&A

解決済

1回答

1131閲覧

Ruby on Rails【Createメソッドに遷移できない】

masa5281

総合スコア13

Ruby

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

Ruby on Rails 6

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

0グッド

0クリップ

投稿2022/08/15 07:01

質問内容

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>

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージのとおりです。

createで失敗して、render :newを実行した際に、@roomcreate内で設定されていないためnilとなり、メソッドの呼び出しに失敗しています。

投稿2022/08/15 07:06

maisumakun

総合スコア145121

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

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

masa5281

2022/08/15 07:10

ご回答ありがとうございます。 質問回答待ちの際に@roomをパラメータで取得すると上記のエラーは解消されました。 私のエラーメッセージの解釈が曖昧だったと反省しております。 ただ、新たなエラー --------- undefined method `to_date' for nil:NilClass --------- が発生してしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問