前提・実現したいこと
railsで宿泊予約サービスのシステムを作成しています。
予約内容を入力した後に、予約確定の画面に移るように「したいのですが、
発生している問題・エラーメッセージ
ActiveRecord::NotNullViolation in ReservationsController#create SQLite3::ConstraintException: NOT NULL constraint failed: reservations.room_id Extracted source (around line #23): 21 @reservation = Reservation.new(reservation_params) 22 @reservation.user = current_user 23 if @reservation.save 24 flash[:notice] = "予約を完了しました" 25 redirect_to room_reservation_path(@room.id) 26 else
該当のソースコード
### resevations_conroller.rb class ReservationsController < ApplicationController before_action :set_search_header, only: [:index, :new, :posts, :show, :create] def index @users = User.all @reservations = Reservation.all end def show @user = User.find(params[:id]) @room = Room.find(params[:id]) end def new @room = Room.find(params[:room_id]) @reservation = Reservation.new end def create @reservation = Reservation.new(reservation_params) @reservation.user = current_user if @reservation.save flash[:notice] = "予約を完了しました" redirect_to room_reservation_path(@room.id) else render :new end end def update end private def set_search_header @search_header = User.ransack(params[:q]) if @search_header @users = @search_header.result(distinct: true) end end def reservation_params params.require(:reservation).permit(:user_id, :room_id, :start_date, :end_date, :number_of_people, :total_price) end end
### 予約入力画面(reservation/new.html.erb) <%= render "devise/shared/error", obj: @reservation %> <div class="raw"> <%= form_for @reservation do |f| %> <div class="d-flex"> <%= f.hidden_field :id, value: @reservation.id %> <div class="col-md-6"> <%= f.label :start_date, "開始日" %> <%= f.date_field :start_date, class: 'reservation-contents' %> </div> <div class="col-md-6"> <%= f.label :end_date, "終了日" %> <%= f.date_field :end_date, class: 'reservation-contents' %> </div> <div class="col-md-6"> <%= f.label :number_of_people, "人数" %> <%= f.number_field :number_of_people, class: 'reservation-contents' %> </div> <%= f.submit "予約する", class: 'form-control btn-primary mb-4' %> </div> <% end %> </div>
### 予約確定画面(reservation/show.html.erb) <%= render 'users/host' %> <%= form_for @reservation do |f| %> <div class="container-fiuld user"> <div class="row"> <div class="d-flex"> <div class="col-md-12 user-view"> <div class="user-view-box"> <% @reservation.each do |reservation| %> <div class="update-content"> <div class="row"> <div class="d-flex"> <%= f.label :room_name, '予約した部屋', class: 'col-md-3' %> <%= link_to room.room_name(room.id), room_path(room.id), class: "col-md-9" %> </div> </div> <div class="row"> <div class="d-flex"> <%= f.label :start_date, '開始日', class: 'col-md-3' %> <%= room.start_date(room.id), class: 'col-md-9' %> </div> </div> <div class="row"> <div class="d-flex"> <%= f.label :end_date ,'終了日', class: 'col-md-3' %> <%= room.end_date(room.id), class: 'col-md-9' %> </div> </div> <div class="row"> <div class="d-flex"> <%= f.label :total_price ,'価格', class: 'col-md-3' %> <%= room.price * room.number_of_people(room.id), class: 'col-md-9' %> </div> </div> </div> <% end %> </div> </div> </div> </div> </div> <div> <ul> <li><%= f.submit '登録完了する' %><li> <li><%= link_to "トップ画面に戻る", user_path(current_user.id) %></li> </ul> </div> <% end %>
### reservation.rb class Reservation < ApplicationRecord belongs_to :user, optional: true belongs_to :room, optional: true with_options presence: true do validates :start_date validates :end_date validates :number_of_people end validates_acceptance_of :confirming after_validation :check_confirming
試したこと
下記のサイトを参考にしましたが、解決に至りませんでした。
[https://teratail.com/questions/278865]
まだ始めたばかりで説明不足な点もあるかと思いますが、皆様の知恵を貸してください。よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/15 07:59
退会済みユーザー
2021/05/15 09:37
2021/05/15 12:49
退会済みユーザー
2021/05/15 13:27