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

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

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

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

Q&A

解決済

2回答

694閲覧

`undefined method '[]' for nil:NilClass`を解決したい

wattyo

総合スコア10

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/08/14 15:51

編集2020/08/15 06:43

前提・実現したいこと

今某スクールのチーム開発にてフリマアプリの開発をしています。
ウィザード形式で登録するという形式にしており、使用しているgemはdeviseです。
userの新規作成ができていないのか、undefined method '[]' for nil:NilClassがでます。

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

イメージ説明

該当のソースコード

registrations_controller (抜粋)

ruby

1def new 2 @user = User.new 3 end 4 5 def create 6 @user = User.new(sign_up_params) 7 unless @user.valid? 8 flash.now[:alert] = @user.errors.full_messages 9 render action: :new and return 10 end 11 session["devise.regist_data"] = {user: @user.attributes} 12 session["devise.regist_data"][:user][:password] = params[:user][:password] 13 @phone_number = @user.build_phonenumber 14 render :new_phone_number 15 end 16 17 def create_phone_number 18 @user = User.new(session["devise.regist_data"]["user"]) 19 @phone_number = PhoneNumber.new(phone_number_params) 20 unless @phone_number.valid? 21 flash.now[:alert] = @phone_number.errors.full_messages 22 render :new_phone_number and return 23 end 24 @user.build_phonenumber(@phone_number.attributes) 25 @address = @user.build_address 26 render :new_address 27 end 28 29 30 31 def create_address 32 @user = User.new(session["devise.regist_data"]["user"]) 33 @phone_number = PhoneNumber.new(session["phone_number"]) 34 @address = Address.new(address_params) 35 unless @address.valid? 36 flash.now[:alert] = @address.errors.full_messages 37 render :new_address and return 38 end 39 @user.build_address(@address.attributes) 40 @credit_card = @user.build_creditcard 41 render :new_credit_card 42 end 43 44 def phone_number_params 45 params.require(:phone_number).permit(:number) 46 end

new.html.haml (抜粋)

ruby

1.signUpNewInfo 2 .signUpNewInfoBox 3 %h2.signUpNewInfoBox__title 4 会員情報入力 5 = form_with model: @user, url: users_sign_up_phone_number_path, class: "Box", local: true do |f| 6 = render "devise/shared/error_messages", resource: @user

new_phone_number.html.haml(抜粋)

.signUpBox %h2.signUpBox__title 電話番号登録 = form_with model: @phone_number, url: users_sign_up_address_path, class: "phoneNumberForm",local: true do |f| = render "devise/shared/error_messages", resource: @phone_number

new_address.html.haml(抜粋)

ruby

1= form_with model: @address ,url: users_sign_up_credit_card_path, class: "deliveryAddressForm", local: true do |f| 2 = render "devise/shared/error_messages", resource: @address

routes.rb

ruby

1devise_scope :user do 2 get "users/sign_up/address", to: "users/registrations#new_address" 3 post "users/sign_up/address", to: "users/registrations#create_address" 4 get "users/sign_up/credit_card", to: "users/registrations#new_credit_card" 5 post "users/sign_up/credit_card", to: "users/registrations#create_credit_card" 6 get "users/sign_up/phone_number", to: "users/registrations#new_phone_number" 7 post "users/sign_up/phone_number", to: "users/registrations#create_phone_number" 8 get "users/sign_up/done", to: "users/registrations#done" 9 post "users/sign_up/done", to: "users/registrations#done" 10 end

試したこと

form_withのところで問題があるのではと思い、modelや参照先のurlを変えてみたりしましたが変わらず。

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

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

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

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

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

wattyo

2020/08/14 16:14

おかしいのは、form_withではなく、コントローラーですね。
wattyo

2020/08/15 02:10 編集

すいません。タイトルが間違ってしたので編集しました。
guest

回答2

0

自己解決

解決しました。form_withでのパス先が違っていたので、そもそもcreateアクションを経由していなかったので、変更したら解決しました。

投稿2020/08/15 08:21

wattyo

総合スコア10

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

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

0

入力エリアにそのfieldが無いのですから、paramsに無いのが正解です。
stepごとにUser.newしているからうまく行っていないのです。
一番最初のcreateでuserの作成は成功していますか?
でしたら以降は User.newではなく、User.find(params[:id])で得たuserに対して、追加の情報を入れていってください。
そのためには
= form_with model: @phone_number,
でなく
= form_with model: @user,
です

投稿2020/08/15 04:47

winterboum

総合スコア23284

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

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

wattyo

2020/08/15 05:53

回答ありがとうございます。routesの部分でpostメソッドのところを変えたら、createアクションが動きましたが、どうもuserの作成がうまくいっていないみたいです。
winterboum

2020/08/15 06:12

それでは情報皆無。 うまく行っていない ではなく どうなったのか、エラーメッセージはなに、など情報を
wattyo

2020/08/15 06:43

すいません。質問内容編集しました。
winterboum

2020/08/15 07:03

生成と言ってもsaveしていないので、メモリー上だけですね、できていても。 で unless @user.valid? は通っているから phoneの方に行けたので、createは問題ないように見えるのですがなぜsession["devise.regist_data"]がnilなのか、、、 ねんのため 全てのsession["devise.regist_data"] をsession["devise_regist_data"] に変えて試してください
wattyo

2020/08/15 07:37

変えてみましたが、結果は全く変わらずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問