EDIT:
bwalshy - помог мне решить проблему - я выводил сообщение об ошибке stati c вместо фактического ответа сервера. Как только я обработал ответ сервера, стало очевидно, что я пытался создать тестовую учетную запись с паролем «123», что слишком мало для стандартов гемов. Кодирование - это унизительный опыт.
Я видел этот вопрос опубликованным, но без каких-либо решений, которые мне подходят. У меня есть интерфейс React, который устанавливается поверх приложения Rails. Когда я пытаюсь вызвать контроллер регистрации, я получаю следующую ошибку:
Completed 422 Unprocessable Entity in 103ms
Я увидел, что это может быть связано с токеном, и регистрация токена показывает, что кажется действительным: v4Ml1tlzkgBKWBcYGP9SGO + YVL7fxcxs3D8MhC3Z / 3ZcZOa5rYGSHUABG + vL + yJfoVfO1Ks6RLI60sQDk7Hh8A ==
, передаваемое в заголовках
Ответ сервера:
{"error":"signup error"}
Вот компонент React
import React from "react";
class SignUp extends React.Component {
constructor(props) {
super(props);
this.state = {
signupUnsuccessful: false,
email: '',
passwordOne: '',
passwordTwo: '',
error: null,
};
this.onChange = this.onChange.bind(this);
this.onSubmit = this.onSubmit.bind(this);
};
onChange = event => {
this.setState({ [event.target.name]: event.target.value });
}
//this is erroring and I think it's because I'm not telling devise to deliver json
onSubmit(event) {
event.preventDefault();
const url = "http://localhost:3000/users";
const { email } = this.state;
const password = this.state.passwordOne
const userInfo = {
user: {
email,
password
}
}
const token = document.querySelector('meta[name="csrf-token"]').content;
console.log(token)
fetch(url, {
method: "POST",
headers: {
"X-CSRF-Token": token,
"Content-Type": "application/json"
},
body: JSON.stringify(userInfo)
})
.then(response => {
if (response.ok) {
return response.json();
}
throw new Error("Network response was not ok.");
})
.catch(error => console.log(error.message));
}
render() {
const {
email,
passwordOne,
passwordTwo,
error,
} = this.state;
const isInvalid =
passwordOne !== passwordTwo ||
passwordOne === '' ||
email === '';
return (
<div>
<h2>Signup</h2>
<form onSubmit={this.onSubmit}>
<input name="email"
value={email}
onChange={this.onChange}
type="text"
placeholder="Email Address"/>
<input name="passwordOne"
value={passwordOne}
onChange={this.onChange}
type="password"
placeholder="Password" />
<input name="passwordTwo"
value={passwordTwo}
onChange={this.onChange}
type="password"
placeholder="Confirm Password"/>
<button disabled={isInvalid} type="submit">
Sign Up
</button>
</form>
<button onClick={() => this.props.changePage("login")}>Login!</button>
</div>
);
};
};
export default SignUp;
и контроллер:
class RegistrationsController < Devise::RegistrationsController
def create
@user = User.new(user_params)
if @user.save
render json: @user
else
warden.custom_failure!
render json: { error: 'signup error' }, status: :unprocessable_entity
end
end
def update
@user = User.find_by_email(user_params[:email])
if @user.update_attributes(user_params)
render json: @user
else
warden.custom_failure!
render :json=> @user.errors, :status=>422
end
end
def destroy
@user = User.find_by_email(user_params[:email])
if @user.destroy
render :json=> { success: 'user was successfully deleted' }, :status=>201
else
render :json=> { error: 'user could not be deleted' }, :status=>422
end
end
private
def user_params
params.require(:user).permit(:email, :password, :password_confirmation)
end
end
И мои маршруты
Rails.application.routes.draw do
devise_for :users, controllers: { registrations: 'registrations', sessions: 'sessions' }
root 'homepage#index'
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end