Rails-POST请求:错误500(内部服务器错误)



我是一名初级程序员,我正试图使用React作为前端,使用RubyonRails作为后端来创建一个应用程序。每当我按下注册按钮并将请求发送到服务器时,我都会收到一个错误,我无法弄清楚它是什么。救命!

控制台:

注册js:17

POST http://localhost:4000/users 500 (Internal Server Error)
SignUp.js:26 
Response {type: 'basic', url: 'http://localhost:4000/users', redirected: false, status: 500, ok: false, …} body: (...) body Used: true headers: Headers {} ok: false redirected: false status: 500 statusText: "Internal Server Error" type: "basic" url: "http://localhost:4000/users" [[Prototype]]: Response

尝试访问localhost 时

GET http://localhost:3000/me 500 (Internal Server Error)
favicon.ico:1 GET http://localhost:3000/favicon.ico 500 (Internal Server Error)

Rails服务器:

ArgumentError (wrong number of arguments (given 0, expected 1..2)):

app/controllers/users_controller.rb:2:in `<class:UsersController>'
app/controllers/users_controller.rb:1:in `<main>'
Started POST "/users" for 127.0.0.1 at 2022-11-02 23:09:07 -0400

ArgumentError (wrong number of arguments (given 0, expected 1..2)):

app/controllers/users_controller.rb:2:in `<class:UsersController>'
app/controllers/users_controller.rb:1:in `<main>'

反应前端


import React from 'react';
import { useState } from "react";
function SignUp() {
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");

function handleSignUp(e) {
e.preventDefault()

const user = {
username,
password
}
fetch("/users",{
method: "POST",
header: {
"Content-Type" : "application/json"
},
body: JSON.stringify(user)
}).then(r => {
r.json()
console.log(r)})

}

return (
<div>
<form onSubmit={handleSignUp}>
<p>Username</p>
<input
type="text"
value={username}
onChange={(e) => setUsername(e.target.value)}
/>
<p>Password</p>
<input
type="text"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit">Sign Up</button>
</form>
</div>
);
}
export default SignUp;

路线


Rails.application.routes.draw do

# Routing logic: fallback requests for React Router.
# Leave this here to help deploy your app later!

post "/login", to: "sessions#create"
delete "logout", to: "sessions#destroy"
get "/me", to: "users#show"
post "/users", to: "users#create"

get "*path", to: "fallback#index", constraints: ->(req) { !req.xhr? && req.format.html? }

end

控制器


class UsersController < ApplicationController
wrap_parameters
rescue_from ActiveRecord:RecordInvalid, with: :record_invalid_response
def create
user = User.create!(user_params)
render json: user, status: :created
rescue ActiveRecord::RecordInvalid => invalid
end
def show
user = User.find(session[:user_id])
if user
render json: user
else
render json: { error: "Not authorized" }, status: :unauthorized
end
end
private
def user_params
params.permit(:username, :password)
# :first_name, :last_name, :phone_number, :email
end
def record_invalid_response(user)
render json: {error: user.errors.full_messages}, status: :unprocessable_entity
end
end

:错误来自wrap_parameters需要一些参数,请参阅https://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html.

现在,对于JSON请求,您不需要像Rails默认情况下那样调用此函数。但是,我假设Rails用user密钥包装您的params,因此您需要更改params处理,这样的东西应该可以工作:

class UsersController < ApplicationController
rescue_from ActiveRecord::RecordInvalid, with: :record_invalid_response
def create
user = User.create!(user_params)
render json: user, status: :created
end
def show
user = User.find(session[:user_id])
if user
render json: user
else
render json: { error: "Not authorized" }, status: :unauthorized
end
end
private
def user_params
params.require(:user).permit(:username, :password)
# :first_name, :last_name, :phone_number, :email
end
def record_invalid_response(user)
render json: {error: user.errors.full_messages}, status: :unprocessable_entity
end
end

注意:我还从创建操作中删除了rescue,因为它会阻止您的控制器级别rescue_from被使用

相关内容

最新更新