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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Devise

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

POST

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1316閲覧

【初学者】railsAPIモードでjsonにエラーを載せて返すが、フロントでエラーメッセージを取得する方法がわからない

msickpaler

総合スコア14

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Devise

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

POST

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/05/18 04:12

編集2020/05/19 11:15

お世話になっております。
現在、nuxt.jsとrailsAPIによるアプリケーションを作成中です。
その中のユーザー登録機能においてvalidationエラーになったときのエラーメッセージの取得方法がどうしても分かりません。

前提・実現したいこと

ユーザー登録フォームの上部に、下記のエラーメッセージを表示したい。

"errors": { "password": [ "can't be blank" ], "email": [ "can't be blank" ], "name": [ "can't be blank" ], "full_messages": [ "Password can't be blank", "Email can't be blank", "Name can't be blank" ] }

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

とても長いエラーですみません。要は、data.errorsの取得方法がわからないことが問題です。
実際にレスポンスに含まれているので方法があると思うのですが、どうしても表示できません。

{ "url": "/api/auth/", "method": "post", "data": "{\"name\":\"\",\"email\":\"\",\"password\":\"\",\"password_confirmation\":\"\"}", "headers": { "Accept": "application/json, text/plain, */*", "Content-Type": "application/json;charset=utf-8" }, "baseURL": "/", "transformRequest": [ null ], "transformResponse": [ null ], "timeout": 0, "xsrfCookieName": "XSRF-TOKEN", "xsrfHeaderName": "X-XSRF-TOKEN", "maxContentLength": -1, "axios-retry": { "retryCount": 0, "lastRequestTime": 1589774028785 } } [object XMLHttpRequest] { "data": { "status": "error", "data": { "id": null, "provider": "email", "uid": "", "name": "", "image": null, "email": "", "allow_password_change": false, "created_at": null, "updated_at": null }, "errors": { "password": [ "can't be blank" ], "email": [ "can't be blank" ], "name": [ "can't be blank" ], "full_messages": [ "Password can't be blank", "Email can't be blank", "Name can't be blank" ] } }, "status": 422, "statusText": "Unprocessable Entity", "headers": { "access-control-allow-methods": "GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD", "access-control-allow-origin": "*", "access-control-expose-headers": "", "access-control-max-age": "7200", "cache-control": "no-cache", "connection": "close", "content-type": "application/json; charset=utf-8", "date": "Mon, 18 May 2020 03:53:48 GMT", "referrer-policy": "strict-origin-when-cross-origin", "transfer-encoding": "chunked", "vary": "Origin", "x-content-type-options": "nosniff", "x-download-options": "noopen", "x-frame-options": "SAMEORIGIN", "x-permitted-cross-domain-policies": "none", "x-request-id": "a20c0e66-a9c0-4180-a3a1-79ff8197667e", "x-runtime": "0.129725", "x-xss-protection": "1; mode=block" }, "config": { "url": "/api/auth/", "method": "post", "data": "{\"name\":\"\",\"email\":\"\",\"password\":\"\",\"password_confirmation\":\"\"}", "headers": { "Accept": "application/json, text/plain, */*", "Content-Type": "application/json;charset=utf-8" }, "baseURL": "/", "transformRequest": [ null ], "transformResponse": [ null ], "timeout": 0, "xsrfCookieName": "XSRF-TOKEN", "xsrfHeaderName": "X-XSRF-TOKEN", "maxContentLength": -1, "axios-retry": { "retryCount": 0, "lastRequestTime": 1589774028785 } }, "request": {} } true function() { return { // Standard message: this.message, name: this.name, // Microsoft description: this.description, number: this.number, // Mozilla fileName: this.fileName, lineNumber: this.lineNumber, columnNumber: this.columnNumber, stack: this.stack, // Axios config: this.config, code: this.code }; }

該当のソースコード

sign_up.vue

<template> <div class="signup-form"> <form @submit.prevent="registration"> <ul> <li v-for="list in getMessage" :key="list.length"> {{ list }} </li> </ul> <p><input v-model="name" type="text" placeholder="ニックネーム" /></p> <p> <input v-model="email" type="text" placeholder="example@example.com" /> </p> <p><input v-model="password" type="password" placeholder="password" /></p> <p> <input v-model="password_confirmation" type="password" placeholder="password" /> </p> <div class="signup-btn"> <button type="submit">Sign up</button> </div> </form> </div> </template> <script> import { mapGetters } from 'vuex' export default { data() { return { error: null, name: '', email: '', password: '', password_confirmation: '' } }, computed: { ...mapGetters({ 'getMessage' }) }, methods: { registration() { this.$store.dispatch('sign_up', { name: this.name, email: this.email, password: this.password, password_confirmation: this.password_confirmation }) } } } </script>

store/actions.js

export default { // サインアップ処理 async sign_up({ context, commit, $axios }, authData) { const payload = { messasge: '' } await this.$axios .post('/api/auth/', { name: authData.name, email: authData.email, password: authData.password, password_confirmation: authData.password_confirmation }) .then((response) => { payload.message = response.data this.$router.push('/') }) .catch((errors) => { payload.message = errors console.log(errors) }) .finally(() => { commit('setMessage', payload) }) } }

store/mutations.js

export default { setMessage(state, payload) { state.message = payload.message } }

store/index.js

import Vuex from 'vuex' import mutations from './mutations' import actions from './actions' const store = () => { return new Vuex.Store({ state: { message: '' }, getters: { getMessage(state) { return state.message } }, mutations, actions }) } export default store

下記はdevise_token_authのgithubに記載されているユーザー登録時のエラーハンドリングです。

def render_create_error render json: { status: 'error', data: resource_data, errors: resource_errors }, status: 422 end

試したこと

  • actions.jsにおいて下記を変更しても表示されませんでした。
.catch((errors) => { payload.message = errors # これをerrors.dataやerrors.errorsなどに変更したが表示されない console.log(errors) })
  • postmanというアプリでAPIに同じPOSTリクエストを送ったところ、下記が返ってきました。
{ "status": "error", "data": { "id": null, "provider": "email", "uid": "", "name": null, "image": null, "email": null, "allow_password_change": false, "created_at": null, "updated_at": null }, "errors": { "password": [ "can't be blank" ], "email": [ "can't be blank" ], "name": [ "can't be blank" ], "full_messages": [ "Password can't be blank", "Email can't be blank", "Name can't be blank" ] } }

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

devise (4.7.1)
devise_token_auth (1.1.3)
nuxt.js (1.0.0)

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

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

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

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

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

guest

回答1

0

自己解決

レスポンスデータにリクエストヘッダーの情報が搭載されていることを疑問に思い、おもむろに

errors.response

とするとレスポンスデータだけにできました。

投稿2020/05/21 06:17

msickpaler

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問