Devise 422 Unprocessable Entity Error при вызове контроллера из внешнего интерфейса React - PullRequest
0 голосов
/ 27 февраля 2020

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
...