Rails APIとNuxt.jsを使用しております。
新規ユーザーを作成する機能を実装したいのですが、password can't be blankというエラーが出て先に進めません。
パスワードの暗号化にはbcryptを使用しております。
関係していそうなソースは以下の通りです。
rails c
でユーザーを作成した場合には問題なくできるのですが、何が原因でしょうか?
- models/user.rb
rb
1class User < ApplicationRecord 2 has_secure_password 3 4 has_many :pdfs, dependent: :destroy 5 6 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i 7 8 validates :name, presence: true 9 validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX } 10end
- config/routes.rb
rb
1Rails.application.routes.draw do 2 namespace 'api' do 3 namespace 'v1' do 4 5 namespace :admin do 6 resources :users 7 end 8 9 post 'user_token' => 'user_token#create' 10 get '/users/current' => 'current#index' 11 12 resources :companies, except: [:new, :edit] 13 resources :users, except: [:new, :edit], shallow: true do 14 resources :pdfs, except: [:new, :edit] 15 end 16 17 end 18 end 19end
- controllers/api/v1/user.rb
rb
1module Api 2 module V1 3 class UsersController < ApplicationController 4 before_action :authenticate_user 5 before_action :set_user, only: [:show, :update, :destroy] 6 7 def index 8 users = User.order(created_at: :desc) 9 render json: { status: 'SUCCESS', message: 'Loaded users', data: users } 10 end 11 12 def show 13 render json: { status: 'SUCCESS', message: 'Loaded the user', data: @user } 14 end 15 16 def create 17 user = User.new(user_params) 18 if user.save 19 render json: { status: 'SUCCESS', data: user } 20 else 21 render json: { status: 'ERROR', data: user.errors } 22 end 23 end 24 25 def destroy 26 @user.destroy 27 render json: { status: 'SUCCESS', message: 'Deleted the user', data: @user } 28 end 29 30 def update 31 if @user.update(user_params) 32 render json: { status: 'SUCCESS', message: 'Updated the user', data: @user } 33 else 34 render json: { status: 'SUCCESS', message: 'Not updated', data: @user.errors } 35 end 36 end 37 38 private 39 40 def set_user 41 @user = User.find(params[:id]) 42 end 43 44 def user_params 45 params.require(:user).permit(:name, :email, :password, :password_confirmation, :admin) 46 end 47 end 48 end 49end 50
- Nuxt.js
vue
1<template> 2 <v-form> 3 <v-text-field v-model="name" label="名前" /> 4 <v-text-field v-model="email" label="メールアドレス" /> 5 <v-text-field v-model="password" label="パスワード" /> 6 <v-text-field v-model="passwordConfirmation" label="パスワード確認" /> 7 <v-btn @click="createUser">作成</v-btn> 8 </v-form> 9</template> 10 11<script> 12export default { 13 layout: 'admin', 14 data() { 15 return { 16 name: '', 17 email: '', 18 password: '', 19 passwordConfirmation: '' 20 } 21 }, 22 methods: { 23 createUser() { 24 const newUser = { 25 name: this.name, 26 email: this.email, 27 password: this.password, 28 password_confirmation: this.passwordConfirmation, 29 admin: false 30 } 31 32 this.$axios 33 .$post('/users', newUser) 34 .then((res) => { 35 console.log(res) 36 }) 37 .catch((error) => { 38 console.log(error) 39 }) 40 } 41 } 42} 43</script> 44
binding.pry などを使って、コントローラの create アクションで params がどういう値になっているか確認し、教えてください。
使ってみたところ、以下のようなパラメーターになっておりました。
`"user"=>{"~~~"}`の部分がおかしいのでしょうか?
```
Processing by Api::V1::UsersController#create as HTML
Parameters: {"name"=>"山田 太郎", "email"=>"taro@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "admin"=>false, "user"=>{"name"=>"山田 太郎", "email"=>"taro@gmail.com", "admin"=>false}}
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 980190962], ["LIMIT", 1]]
```
回答1件
あなたの回答
tips
プレビュー