前提・実現したいこと
railsを使って簡単な予約システムを制作しております。
新規予約をしたら予約テーブルに予約日と予約時間と予約したい商品をテーブルへ保存したいのですが、以下のエラーがでてしまっています。
発生している問題・エラーメッセージ
NoMethodError in ReservationsController#create undefined method
該当のソースコード
コントローラー
ruby
1class ReservationsController < ApplicationController 2 before_action :product_name, only:[:new, :create, :edit, :update] 3 before_action :reservation_product, only:[:new, :create] 4 5 def index 6 end 7 8 def new 9 @reservation = Reservation.new 10 end 11 12 def create 13 @reservation = Reservation.create(reservation_params) 14 15 unless @reservation.save 16 render :new 17 end 18 end 19 20 def edit 21 end 22 23 def update 24 end 25 26 def destroy 27 end 28 29 30 private 31 def reservation_params 32 params.require(:reservation).permit(:date, :time, products_attributes: [:product_name, :_destroy, :id]) 33 end 34 35 def product_name 36 @products = Product.select(:product_name) 37 end 38 39 def reservation_product 40 @product = Product.where(product_name: nil) 41 end 42 43end
モデル
ruby
1class Reservation < ApplicationRecord 2 validates :date, presence: true 3 validates :time, presence: true 4 validates :product_name, presence: true 5 6 has_one :product 7 belongs_to :user 8end
newアクションのビュー
ruby
1.Body 2 .Form-box 3 = form_with model: @reservation, local: true do |f| 4 .alert 5 = render 'layouts/notifications' 6 .Form-box__content 7 = f.label :date, 'ご希望の日にち', class: "Form-box__content__title" 8 %span.Form-box__content__requirement 9 必須 10 = f.date_field :date, class: "Form-box__content__select" 11 .alert 12 = render 'layouts/notifications' 13 .Form-box__content 14 = f.label :time, 'ご希望のお時間', class: "Form-box__content__title" 15 %span.Form-box__content__requirement 16 必須 17 = f.select :time, 18 { '10:00~': 1, 19 '11:00~': 2, 20 '12:00~': 3, 21 '13:00~': 4, 22 '14:00~': 5, 23 '15:00~': 6, 24 '16:00~': 7, 25 '17:00~': 8, 26 '18:00~': 9, 27 '19:00~': 10 }, 28 { include_blank: '選択してください' }, 29 { class: "Form-box__content__select" } 30 .alert 31 = render 'layouts/notifications' 32 .Form-box__content 33 = f.label :product_name, 'ご希望のコース', class: "Form-box__content__title" 34 %span.Form-box__content__requirement 35 必須 36 = f.select :product_name, @products.map { |product| [product.product_name]}, 37 { include_blank: '選択してください' }, 38 { class: "Form-box__content__select" } 39 -# .Form-box__content 40 -# = f.label :price, 'ご希望のコースの金額', class: "Form-box__content__title" 41 -# .Form-box__content__price 42 -# %p ここに金額が表示される 円 43 .Form-box__content 44 = f.submit '予約', class: "Form-box__button"
マイグレーションファイル
ruby
1class CreateReservations < ActiveRecord::Migration[6.0] 2 def change 3 create_table :reservations do |t| 4 t.datetime :date, null: false 5 t.datetime :time, null: false 6 t.timestamps 7 end 8 end 9end
ruby
1class AddProductToReservation < ActiveRecord::Migration[6.0] 2 def change 3 add_reference :reservations, :product, null: false, foreign_key: true 4 end 5end
試したこと
①エラーではストロングパラメータが色づいていたので、ストロングパラメータを見直し、以下のように編集しましたが、変わらなかったです。
params.require(:reservation).permit(:date, :time, products_attributes: [:product_name, :_destroy, :id])
②binding.pryにてparamsと打ち込むとpermitted: falseとなりました。
補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー