【问题标题】:params.require 正在阻止创建帐户[关闭]
【发布时间】:2022-01-23 12:08:06
【问题描述】:

当我尝试创建一个帐户时,我收到一个错误,即请求失败,状态码为 422。当我使用 params.require 时会发生这种情况,但是当我只使用 params.permit 时它可以工作但仍然显示

不允许的参数

我已经检查过了,参数正在通过。我遇到的另一个问题是我得到了

密码不能为空

尝试使用params.require 创建帐户时。我正在使用has_secure_passwordbcrypt

我拥有的唯一验证:

validates :username, presence: true, confirmation: {case_sensitive: false}, uniqueness: true, length: {in: 6..30}
validates :password, presence: true, confirmation: true

这是我的代码:

class UsersController < ApplicationController
skip_before_action :authorize, only: [:create]

def create
    # byebug
    user = User.create!(user_params)
    session[:user_id] = user.id
    render json: user, status: :created
end

def show
    render json: @current_user, include: :animes
end

def update
    user = User.find_by(id: params[:id])
    if user.update(user_params)
        render json: user, status: :ok
    else
        render json: user.errors, status: :unprocessable_entity
    end
end

private

def user_params
    params.require(:user).permit(:username, :password, :password_confirmation, :bio, :avatar, :email)
end

end

这是错误的图片:

这是我在前端的表单的所有代码:

 <Form.Group className="mb-2">
                    <Form.Label className="signup-form-headers">Username</Form.Label>
                    <Form.Control type="username" value={formData.username} name="username" onChange={handleInput} placeholder="Enter Username" />
                </Form.Group>
                <Form.Group className="mb-2" controlId="formBasicPassword">
                    <Form.Label className="signup-form-headers">Password</Form.Label>
                    <Form.Control type="password" value={formData.password} name="password" onChange={handleInput} placeholder="Password" autoComplete="on"/>
                </Form.Group>
                <Form.Group className="mb-3" controlId="formBasicPasswordConfirmation">
                    <Form.Label className="signup-form-headers">Confirm Password</Form.Label>
                    <Form.Control type="password" value={formData.password_confirmation} name="password_confirmation" onChange={handleInput} placeholder="Confirm your password" autoComplete="on"/>
                </Form.Group>

    const [formData, setFormData] = useState({
    username:"",
    password:"",
    password_confirmation:""
})
const [errors, setErrors] = useState([])
const history = useHistory()

function handleInput(e) {
    setFormData({...formData, [e.target.name]: e.target.value})
}

    async function handleSubmit(e) {
    e.preventDefault()
    try {
        if (formData.password != formData.password_confirmation) {
            setErrors(["Password and Password confirmation do not match"])
            return
        }
        await axios.post('/signup', formData)
        setUserIsLoggedIn(true)
        setFormData({
            username:"",
            password:"",
            password_confirmation:""
        })
        history.push("/")
    } catch (error) {
        console.log("error:", error)
        console.log("error data:", error.response.data.errors)
        setErrors(error.response.data.errors)
    }
}

是什么阻止了帐户创建?

【问题讨论】:

  • 看起来您的表单没有正确嵌套。 usernamepasswordpassword_confirmation 也应该嵌套在 user 哈希中。你的表单是什么样子的?
  • 显示 html.erb 文件

标签: ruby-on-rails ruby


【解决方案1】:

您的参数没有像@spickermann 所说的那样正确嵌套。检查您的表单字段是否正确嵌套。

用户名嵌套在根级别,密码和确认仅在根级别。

当您使用require(:user).permit 时,"user" 中仅存在用户名,并且您的密码字段为空时会出现验证错误。

当您只使用permit 而不使用require 时,将采用根级别属性,"user" 将被禁止并发出警告。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2022-01-02
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多