前提・実現したいこと
現在railsの学習でユーザーが部屋を登録したり予約できるといった機能の作成を行なっています。
しかし作成をしている途中でタイトルのようなエラーが発生してしましました。
具体的には部屋を登録する(greenhouseモデル)、部屋を予約する(reserverモデル)を1:1で紐づけを行い、部屋の登録ページから予約ページに遷移できるようリンクを用意し予約するための項目を入力し最後予約するボタンでdbに保存される状態をつくりました。
予約完了ボタンを押下した際に項目を全て入力した際のcontrollerのcreateアクションは正常通りに作動してくれるのですが項目を空欄した際に本来出るはずのバリデーション、エラーメッセージが出ません。
どなたかアドバイス等よろしくお願いします。
発生している問題・エラーメッセージ
NoMethodError in Reservers#create undefined method `id' for nil:NilClass
該当のソースコード
rails
1<h3>新規予約</h3> 2 3 <%= render "shared/error", obj: @reserver %> 4 5 <%= form_for @reserver do |f| %> 6 <%= f.hidden_field :user_id, value: current_user.id %> 7 <%= f.hidden_field :greenhouse_id, value: @greenhouse.id %> 8 <table class = "reserver_table" > 9 <tr> 10 <th>サンプルイメージ</th> 11 <td class = "room_sample"> 12 <%= image_tag @reserver.greenhouse.image %> 13 </td> 14 </tr> 15 16 <tr> 17 <th>料金</th> 18 <td><%= @reserver.greenhouse.price %>円/日</td> 19 </tr> 20 21 <tr> 22 <th><%= f.label :開始日 %></th> 23 <td><%= f.date_field :start, class:"start-content" %></td> 24 </tr> 25 26 <tr> 27 <th><%= f.label :終了日 %></th> 28 <td><%= f.date_field :end, class:"end-content" %></td> 29 </tr> 30 31 <tr> 32 <th><%= f.label :人数 %></th> 33 <td><%= f.number_field :number, class:"number-content" %></td> 34 </tr> 35 </table> 36 <div> 37 <ul> 38 <li><%= f.submit "予約を完了する" %></li> 39 </ul> 40 </div> 41 <% end %> 42 43 <div> 44 <ul> 45 <li><%= link_to "予約一覧に戻る", :reservers %></li> 46 </ul> 47 </div>
rails
1class ReserversController < ApplicationController 2 def index 3 @reservers = Reserver.all 4 end 5 6 def new 7 @reserver = Reserver.new 8 @greenhouse = Greenhouse.find(params[:format]) 9 end 10 11 def create 12 @reserver = Reserver.new(params.require(:reserver).permit(:start, :end, :number, :total, :user_id, :greenhouse_id)) 13 if @reserver.save 14 flash[:notice] = "新規予約をしました" 15 redirect_to action: :index 16 else 17 render :new 18 end 19 end 20 21 def show 22 @reserver = Reserver.find(params[:id]) 23 end 24 25 def edit 26 @reserver = Reserver.find(params[:id]) 27 end 28 29 def update 30 @reserver = Reserver.find(params[:id]) 31 if @reserver.update(params.require(:reserver).permit(:start, :end, :number, :total, :user_id, :greenhouse_id)) 32 flash[:notice] = "投稿を更新しました" 33 redirect_to :reservers 34 else 35 render "edit" 36 end 37 end 38 39 def destroy 40 @reserver = Reserver.find(params[:id]) 41 @reserver.destroy 42 flash[:notice] = "投稿を削除しました" 43 redirect_to :reservers 44 end 45end
試したこと
binding_pryでデータがうけたされているかの確認を行なった所しっかり渡せているように見えますが結果は以下のようでした。
補足情報(FW/ツールのバージョンなど)
aws cloud9
rails 6.1
追記:
またnewアクションの新規作成画面で本来ならurlがreservers/new/1になるはずが
reserever/new.1になっていることも原因の一つでしょうか?
気になりましたので情報として追加させていただきます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。