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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

1720閲覧

ActionController::ParameterMissing (param is missing or the value is empty: registration)が起こる。

taguho

総合スコア0

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/07/04 10:50

編集2021/07/04 10:52

railsとreactを使ってSPAの開発をしています。
devise_token_authを使って、フォーム(Reactメイン)から送信された値を使って、サインアップを試みている最中です。

フォームからPOSTメソッドを実行すると、以下のようなエラーが出てしまいます。
イメージ説明

サーバーサイド

api/v1/auth/registrations_controller

1class Api::V1::Auth::RegistrationsController < DeviseTokenAuth::RegistrationsController 2 private 3 def sign_up_params 4 params.require(:registration).permit(:name, :email, :password, :password_confirmation) 5 end 6 7 def account_update_params 8 params.permit(:name, :nickname, :email, :img) 9 end 10 11end 12

フロント側における、各フォームのname属性では
name="name",
name="email,
name="password",
name="password_confirmation"

としているのに、上記のエラーが出てしまうのはなぜでしょうか?
良ければ解決策のご教授お願いします。

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

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

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

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

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

guest

回答2

0

自己解決

axiosでPOSTメソッドを使うことを諦め、formにaction属性とmethod属性を付与すると一発でいけました。

<form className={classes.form} noValidate action="http://localhost:3000/api/v1/auth" method="POST">

なぜ、axios.postとformの中身をパラメータとして送れないのか不思議でした、、、

投稿2021/07/06 15:14

taguho

総合スコア0

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

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

0

params.require(:registration)と書いているのに、registerationをname属性に指定していないからだと思います。

HTMLのname属性とRailsのparamsの受け取り方の対応はこんな感じです。

<input type="text" name="email" ...> => params[:email]
<input type="text" name="registration[email]"...> => params[:registration][:email]

したがって、

ruby

1params.require(:registration).permit(:name, :email, :password, :password_confirmation)

と書いているのに、フロントでname="name"と書いたらエラーになるのは当然です。

フロントのinput,select,textareaなどのname属性の指定を以下のように修正するとエラーにならないと思います。
name="registration[name]
name="registration[email]
name="registration[password]
name="registration[password_confirmation]

投稿2021/07/04 11:57

mingos

総合スコア4032

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

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

taguho

2021/07/04 12:42

返信ありがとうございます。 実践したところ、やはり同じエラーが出てしまいました。。。 apiを叩くライブラリとしてaxiosを使っているのですが、何か関係ありますでしょうか?
mingos

2021/07/04 12:49

そうであれば、axiosのパラメータの指定が間違っていると思います。 axiosのPOSTしている部分のソースコードも記載してください。
taguho

2021/07/04 14:25 編集

こちらになります。 import axios from 'axios' export const userSignup = (params) => { return axios.post("http://localhost:3000/api/v1/auth/", { name: params.name, email: params.email, password: params.password, password_confirmation: params.password_confirmation, } ) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); }
mingos

2021/07/04 14:32

そこですね。 POSTするときのパラメータ名がname,emailなどとなっていますよね? そこを変える必要があります。 わかりやすくするためにPOSTパラメータを変数にします。 let post_params = { 'registration[name]': params.name, 'registration[email]': params.email, 'registration[password]': params.password, 'registration[password_confirmation]': params.password_confirmation, }; return axios.post("http://localhost:3000/api/v1/auth/", post_params ) という感じにするべきかと思います。 で、たぶんparamsの構造がこの例で示したようになっていると思うので、 paramsの形が正しければ、 これで済むはずです。 return axios.post("http://localhost:3000/api/v1/auth/", params)
taguho

2021/07/04 15:04

ご丁寧にどうもありがとうございます。 全体像としては以下のような形ですか? import axios from 'axios' export const userSignup = (params) => { let post_params = { 'registration[name]': params.name, 'registration[email]': params.email, 'registration[password]': params.password, 'registration[password_confirmation]': params.password_confirmation, }; return axios.post("http://localhost:3000/api/v1/auth/", post_params ) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); }
mingos

2021/07/04 15:08

そうですね。それでいいはずです。
taguho

2021/07/04 15:29 編集

また同じエラーが出ました、、、 フォーム部分のソースコードも貼り付けます、良ければ確認お願いします。 また、materai-uiをコンポーネントライブラリとして使用しています。 下記のソースコードのname属性にregistration[""]をつけていませんが、つけてもダメでした。 <form className={classes.form} noValidate> <Grid container spacing={2}> <Grid item xs={12}> <TextField variant="outlined" required fullWidth id="name" label="Name" name="name" autoComplete="lname" /> </Grid> <Grid item xs={12}> <TextField variant="outlined" required fullWidth id="email" label="Email Address" name="email" autoComplete="email" /> </Grid> <Grid item xs={12}> <TextField variant="outlined" required fullWidth name="password" label="Password" type="password" id="password" /> </Grid> <Grid item xs={12}> <TextField variant="outlined" required fullWidth name="password_confirmation" label="Password Confirmation" type="password" id="password_confirmation" /> </Grid> </Grid> <Button type="submit" fullWidth variant="contained" color="primary" onClick={userSignup}  ←(axiosを使用した変数です。) className={classes.submit} > Sign Up </Button>
mingos

2021/07/04 16:27

では、このように階層にしてみてください。 手元では動きました。 let post_params = { registration: { name: params.name, email: params.email, password: params.password, password_confirmation: params.password_confirmation } };
taguho

2021/07/05 14:18

何度もありがとうございます、やっぱりどうしてもうまくいかないので、適当な値を以下のように入れると、Completed 200 OKが出て成功しました。 (例) let post_params = { registration: { name: "google", email: "google@gmail.com", password: "google", password_confirmation: "google" } }; 最終的な原因としては、paramsがコンポーネント間で受け渡せていないようです、なぜなのでしょうか、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問