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

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

詳細はこちら
Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

479閲覧

ParameterMissingErrorの解決策をお願いします!!

r_hara

総合スコア8

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2019/10/08 08:41

####ウィザードフォーム形式の新規登録画面の実装です。最後の入力画面の送信ボタンでまとめてUsersテーブルとAddressesテーブルに入力内容を保存したいです。

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

ActionController::ParameterMissing in Users::RegistrationsController#create param is missing or the value is empty: user
/users/registrations_controller.rb class Users::RegistrationsController < Devise::RegistrationsController before_action :user_params, only: [:create] def step_1 @user = User.new end def step_2 session[:user_params] = user_params end def step_3 @user = User.new @user.build_address end def create @user = User.new(session[:user_params]) @user.build_address if @user.save redirect_to payment_methods_path else render :user_information end end private def user_params params.require(:user).permit( :nickname, :email, :password, :password_confirmation, address_attributes: [:id, :last_name, :first_name, :last_name_kana, :first_name_kana, :postal_code, :prefecture, :city, :address, :building_name, :phone_number]) end end

このstep_3でcreateアクションを実行しようとした際にエラーが出ます。

haml

1/users/registrations/step_3 2 3= form_with model: @user, url: '/users', method: :post, local: true do |f| 4 = fields_for :address do |a| 5 = a.text_field :last_name 6 = a.text_field :first_name 7 8 = a.text_field :last_name_kana 9 = a.text_field :first_name_kana 10 11 = a.text_field :postal_code 12 13 = a.select :prefecture, Address.prefectures.keys, {} 14 15 = a.text_field :city 16 17 = a.text_field :address 18 19 = a.text_field :building_name 20 21 = a.telephone_field :phone_number 22 23 = f.submit

試したこと

binding.pryで色々中身など確認しつつみていったところコントローラーのcreateアクション内の二行目の@user.build_addressで@userが上書きされてしまってるのではないかと思っています。
ただこの記述方法で作成されていた方の記事をほぼ丸パクリで書いたのですがなぜかエラーになってしまいました。
これ以上冗長になると返っていやかと思ったので他の箇所のコードは載せていないので解決に必要ならば載せますのでよろしくお願いします。

補足情報

ruby 2.5.1

Rails 5.2.3

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

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

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

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

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

winterboum

2019/10/08 10:27

エラーが起きたのは @user = User.new(session[:user_params]) @user.build_address if @user.save のどの行ですか? あと、 @user.build_address のcodeを見せて下さい
r_hara

2019/10/09 03:46 編集

返事が遅くなりすみません。 中身を確認したところ@user = User.new(session[:user_params])までは値が入っているのですが、次の行でsessionで受け取った@userの中身がなくなっているみたいなんですよね。 エラーが出た箇所はrequire(:user)の引数userです。 def user_params params.require(:user).permit(:nickname, :email, :password, :password_confirmation, address_attributes: [:id, :last_name, :first_name, :last_name_kana, :first_name_kana, :postal_code, :prefecture, :city, :address, :building_name, :phone_number]) end @user.build_addressのコードとは下記のことでしょうか? class User < ApplicationRecord has_one :address accepts_nested_attributes_for :address ```
guest

回答2

0

ベストアンサー

未検証ですが、View側の問題だと思います。

Haml

1= form_with model: @user, url: '/users', method: :post, local: true do |f| 2 = f.fields_for :address do |a|

のようにf.fields_forとしないと{ "user" => { "address_attributes" => { ... } } }のようなパラメータが送信されないのでは?

もしくは

Haml

1= form_with model: @user, url: '/users', method: :post, local: true do |f| 2 = fields model: :address do |a|

ですかね、うまくいけばいいんですが。

追記

user_paramsの中身はcreate内で使われていないのにbefore_actionで実行されていますね。
質問箇所とは違うのでこれ以上詳しく見る気は無いですが、見直しは必要だと思います。

投稿2019/10/10 00:27

編集2019/10/10 01:21
Mugheart

総合スコア2349

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

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

r_hara

2019/10/10 06:53

回答ありがとうございます! おっしゃる通りでした。 fileds_forの最初にfをつけることにより解決致しまし。 本当にありがとうございました!!
guest

0

とりあえず、エラーを回避するだけならば

before_action :user_params, only: [:create]

この行を削除

問題はこれを訂正したところで意図通りに動くようには見えないことです。

おそらくですが、

ruby

1 def create 2 @user = User.new(session[:user_params]) 3 @user.build_address

の、build_addressには引数が必要か
もしくはstep1で住所も入力済みだというのならば@user.build_addressは不要という事になります。


追記

自信はないが

ruby

1def address_params 2 params.require(:address).permit(:last_name, :first_name, :last_name_kana, 3 :first_name_kana, :postal_code, :prefecture, :city, 4 :address, :building_name, :phone_number) 5end

ruby

1@user.build_address(address_params)

うーん・・・ボツにして書き直したくなりますが、、、とりあえず動くかなとは思います。
(view側間違えてるような気がしています)

投稿2019/10/08 15:40

編集2019/10/09 05:02
asm

総合スコア15149

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

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

r_hara

2019/10/09 03:50

せっかく回答してくださったのに返事が遅くなりすみません。 はい!自分も試しはしたのですがbefore_actionを消したらエラーは出なくなるのですが解決にはならなかったです(汗) step1ではUserモデル関係のみで住所(Addressモデル関係)は入力していないです。 build_modelの使い方について調べ不足ですね、、、もっと調べてみます。 ありがとうございました。
r_hara

2019/10/09 07:28

address_paramsを作ってみたのですが同じエラーでuserがemptyみたいです(汗) やはりviewの細かい部分でミスがあるのですかね、、、
asm

2019/10/10 00:03

param is missing or the value is empty: userの、ままなんですか? before_action :user_params は消したんですよね?
r_hara

2019/10/10 06:55

お返事ありがとうございます。 やはりview側の問題でした(汗) = fields_forの最初にf.とつけていなかったせいでuserにネストされずにいたのが原因だったようです。 たくさんのアドバイスと回答本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問