🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

Q&A

解決済

2回答

1367閲覧

ネストさせた子モデルの保存ができない

gilja

総合スコア1

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/25 15:59

createアクションでエラーになってしまう

Railsで簡単な予約アプリを作っています。
予約を登録するreservations#newでエラーが出ています。

Lessonモデル,Reservationモデル,Userモデルを作成
アソシエーション済

ruby

1# Lesson.rb 2 has_many :reservations 3# Reservation.rb 4 belongs_to :lessson 5 belongs_to :user 6# User.rb 7 has_many :reservations

ルーティングをネストしています

ruby

1#routes.rb 2 resources :lessons do 3 resources :reservations, only: [:new, :create] 4 collection do 5 get 'adminuser' 6 end 7 end

以下reservations_controller.rbのcreateアクションで@reservation保存できません

ruby

1class ReservationsController < ApplicationController 2 before_action :set_lesson 3 4 def new 5 @reservation = Reservation.new 6 end 7 8 def create 9 @reservation = @lesson.reservations.new(reservation_params) 10 binding.pry 11 if @reservation.save 12 redirect_to root_path 13 else 14 flash.now[:alert] = '申し訳ございません 再度送信いただくか、お電話にてお問い合わせください' 15 render :new 16 end 17 end 18 19 private 20 21 def reservation_params 22 params.require(:reservation).permit(:count).merge(user_id: current_user.id) 23 end 24 25 def set_lesson 26 @lesson = Lesson.find(params[:lesson_id]) 27 end 28end

ruby

1#new.html.haml 2.Reservation__form 3 = form_with model: [@lesson, @reservation], local: true do |f| 4 .ReservationForm 5 .ReservationForm__contents 6 .ReservationForm__label 7 = f.label :count, "何名様ですか?", class: 'RForm__label' 8 .ReservationForm__content 9 = f.number_field :count, autofocus: true, required: true, class: 'RForm__box1' 10 .ReservationForm__btn 11 = f.submit "予約する", class: 'RForm__btn'

試したこと

binding.pryでデバッグをおこない、
reservation_paramsにはちゃんとフォームの内容が入っていました。

linux

1[1] pry(#<ReservationsController>)> params 2=> <ActionController::Parameters {"authenticity_token"=>"bKvaqOO7+xjtWXHsIzthzdOdemBGG7lMzFLxaV9Sj9HhMLXYzKzqRsdOfWPx1ZkxXtNU29FxsXqDWqnLhQrPXg==", "reservation"=><ActionController::Parameters {"count"=>"2"} permitted: false>, "commit"=>"予約する", "controller"=>"reservations", "action"=>"create", "lesson_id"=>"3"} permitted: false> 32] pry(#<ReservationsController>)> @reservation 4=> #<Reservation:0x00007f9f4f28f8e8 id: nil, count: 2, lesson_id: 3, user_id: 12, created_at: nil, updated_at: nil>

初学者なのでスペルミスなどしょうもないミスかなとも思いましたが、
原因わからずお助けいただきたいです

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

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

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

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

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

guest

回答2

0

エラー内容はNo methodでしょうか?Name Errorでしょうか?
それによっては検討箇所も異なるのでご教示いただきたいです。

count、 lesson_id、user_idが保存されていることからビューとmodelの記述に関しては問題ないと思います。
id、created_at、updated_atがnilなのでやはりコントローラーアクションが原因かと思います。

個人的に違和感を感じたのが、

def new @reservation = Reservation.new end

ここではReservationをnewメソッドを用いて新規投稿を作成しているのに対し、

(中略) def create @reservation = @lesson.reservations.new(reservation_params) (中略)

@lesson.reservationsでnewメソッド作った?という感じでno methodエラーが出てるかと予想しています。
(見当違いであればすみません。)

おそらくですが、

@reservation = Reservation.new(reservation_params)

で解消できるかと思います。(もしかしたら、ビューを修正する可能性も出てくるかと思います。)

投稿2020/11/25 22:48

R_Hi-ra

総合スコア12

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

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

gilja

2020/11/28 02:13

ご親切にありがとうございます。 みなさんおっしゃられるように、正確にエラー内容をお伝えすることが大事だとわかりました。 問題はreservation.rbでlessonをlesssonと書いていたせいでした。
guest

0

ベストアンサー

どのようなエラーなのか分かりません。

@reservation.savefalseになるのなら、binding.pryしているところで

@reservation.valid? の後に
@reservation.errors

とすれば、どんなバリデーションエラーが起きているか確認できるはずです。

投稿2020/11/25 22:41

neko_daisuki

総合スコア2090

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

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

gilja

2020/11/28 02:22 編集

みなさんが仰るように、エラー内容をきちんとお伝えするには、エラー表示を伝えないといけないことがわかりました。今回は、なぜバリデーションエラーが起きているのか確認方法がわからなかったせいです。 エラーについては、結論モデルに書いた「lessson」のスペルミスでした neko_daisuki様に教えていただいた方法で、 @base=#<Reservation:0x00007f9f6c0471e0 id: nil, count: 1, lesson_id: 2, user_id: 12, created_at: nil, updated_at: nil>, @details={:lessson=>[{:error=>:blank}]}, @messages={:lessson=>["を入力してください"]}> と出て、それでも理由わからず考え込んでいましたが、 他の方にスペルミス指摘していただき解決に至りました。 バリデーションエラーもっと速く確認していたら、 皆さんを困惑させずにすみました。 もっとデバッグ方法勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問