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

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

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

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

Ruby on Rails

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

640閲覧

アソシエーションがうまくいかないことについて

Engineer_traine

総合スコア17

Ruby on Rails 6

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

Ruby on Rails

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/07/08 13:01

編集2021/07/08 14:23

前提・実現したいこと

現在railsの学習にてモデルのリレーションの実装を行なっています。
具体的には、user.rbとreserver.rbの二つなのですがユーザーのテーブルとホテルの予約のテーブルを紐付けたいと考えています。
しかし、予約の開始日や終了日等の入力を行い予約完了ボタンを押した際に処理が行えません。
エラーメッセージから外部キーが恐らく設定がうまくいっていないことは理解できるのですが。
どなたか回答の方よろしくお願いします。

発生している問題・エラーメッセージ

NoMethodError in Reservers#new undefined method `id' for nil:NilClass

該当のソースコード

rails

1class ReserversController < ApplicationController 2 def index 3 @reservers = Reserver.all 4 end 5 6 def new 7 @reserver = Reserver.new 8 end 9 10 def create 11 @reserver = Reserver.find(params[:id]) 12 @reserver = Reserver.new(params.require(:reserver).permit(:start, :end, :number, :total, :user_id)) 13 if @reserver.save 14 flash[:notice] = "新規予約をしました" 15 redirect_to :index 16 else 17 render :new 18 end 19 end 20 21 def show 22 end 23 24 def edit 25 end 26 27 def update 28 end 29 30 def destroy 31 end 32end

rails

1#reserver/new.html.erbです。 2<h3>新規予約</h3> 3   4 <%= form_for @reserver do |f| %> 5 <table> 6 <tr> 7 <th><%= f.label :開始日 %></th> 8 <td><%= f.date_field :start, class:"start-content" %></td> 9 </tr> 10 11 <tr> 12 <th><%= f.label :終了日 %></th> 13 <td><%= f.date_field :end, class:"end-content" %></td> 14 </tr> 15 16 <tr> 17 <th><%= f.label :人数 %></th> 18 <td><%= f.number_field :number, class:"number-content" %></td> 19 </tr> 20 </table> 21 <%= f.hidden_field :user_id, value: @user.id %> 22 <div> 23 <ul> 24 <li><%= f.submit "予約を完了する" %></li> 25 </ul> 26 </div> 27 <% end %> 28   29 <div> 30 <ul> 31 <li><%= link_to "予約一覧に戻る", :reservers %></li> 32 </ul> 33 </div>

試したこと

binding.pryをdef createの箇所で記述し確認したところstart.end.numberにデータが入っていましたが
curren_userにはデータが存在していませんでした。

補足情報(FW/ツールのバージョンなど)

また、reserver/new.html.erbのコードの内容を
<%= f.hidden_field :current_user, value: @current_user %>
と記述しているためにbinding.pryを行った際にuser_idではなくcurrent_userと出ているのでしょうか?
この場合user_idからcurrent_userにreserverのカラム名を変更すべきでしょうか?

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

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

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

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

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

winterboum

2021/07/08 13:38

new の view が怪しいです。載せてkyださい
Engineer_traine

2021/07/08 14:23

コードの方追加しました。 よろしくお願いします。
guest

回答1

0

ベストアンサー

%= f.hidden_field :user_id, value: @user.id %>
この@userが未定義で使われています。
current_user でよいのでは?

投稿2021/07/08 21:10

winterboum

総合スコア23567

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

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

Engineer_traine

2021/07/09 05:43 編集

回答ありがとうございます。 返信の方遅れてしまい申し訳ありません。 current_userに書き換えた場合、予約完了ができずそのページのままで停止してしまいます。 ターミナルでは以下のような表示になってしまいます。 Started POST "/reservers" for 106.171.84.11 at 2021-07-09 05:36:58 +0000 Cannot render console from 106.171.84.11! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by ReserversController#create as HTML Parameters: {"authenticity_token"=>"[FILTERED]", "reserver"=>{"start"=>"2021-07-09", "end"=>"2021-07-10", "number"=>"1", "user_id"=>"#<User:0x000000000579aa68>"}, "commit"=>"予約を完了する"} TRANSACTION (0.1ms) begin transaction ↳ app/controllers/reservers_controller.rb:12:in `create' User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 0], ["LIMIT", 1]] ↳ app/controllers/reservers_controller.rb:12:in `create' TRANSACTION (0.0ms) rollback transaction ↳ app/controllers/reservers_controller.rb:12:in `create' Rendering layout layouts/application.html.erb Rendering reservers/new.html.erb within layouts/application User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/controllers/application_controller.rb:18:in `current_user' Rendered reservers/new.html.erb within layouts/application (Duration: 3.7ms | Allocations: 1481) [Webpacker] Everything's up-to-date. Nothing to do Rendered layout layouts/application.html.erb (Duration: 8.4ms | Allocations: 4730) Completed 200 OK in 27ms (Views: 9.4ms | ActiveRecord: 0.3ms | Allocations: 10603) user_id自体には値は入ったのですが、うまくsaveできていません。
Engineer_traine

2021/07/09 06:13

追記です。 reservers/new.html.erbのコードを<%= f.hidden_field :user_id, value: current_user.id %> に変更することで解決できました。 ありがとうございました。
winterboum

2021/07/09 09:48

value: current_user %> にしてません?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問