【问题标题】:I keep getting "password can't be blank" error when creating a new user in Rails在 Rails 中创建新用户时,我不断收到“密码不能为空”错误
【发布时间】:2019-02-23 05:48:11
【问题描述】:

我在 Rails API 中创建了一个我认为是简单的用户身份验证的东西。我已经搜索了我可以在这里找到的所有答案,但我根本无法弄清楚我做错了什么。无论如何,当我尝试创建新用户时,我收到错误“密码不能为空”。

这是我的控制器代码:

class UsersController < ApplicationController

  def create
    user = User.new(user_params)
    if user.save
      render json: {user: user}, status: 201
    else
      render json: {errors: user.errors.full_messages}
    end
  end

  private 
  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end

我的模型,带有验证:

class User < ApplicationRecord
  validates :name, presence: true, length: {maximum: 50}
  validates :email, presence: true, length: {maximum: 255}, uniqueness: true

  has_secure_password
  validates :password, presence: {on: :create}, confirmation: {case_sensitive: true}, length: {minimum: 8}
  validates :password_confirmation, presence: true
end

一个不断被拒绝的测试 JSON 对象:

{
    "name": "Jim Nobody",
    "email": "jim@anywhere.com",
    "password": "abc12345",
    "password_confirmation": "abc12345"
}

我不断收到的错误:

{
    "errors": [
        "Password can't be blank",
        "Password can't be blank",
        "Password is too short (minimum is 8 characters)",
        "Password confirmation can't be blank"
    ]
}

我知道这个问题还有其他答案,但我已经逐行梳理了它们,我看不出我做错了什么。据我所知,所有字段都是允许的并且拼写正确。

非常感谢任何帮助。谢谢!

【问题讨论】:

  • 如果您正在手动测试,您是否也可以发布正在发送的params,或者如果您正在正确测试,您可以发布测试代码本身吗?
  • 当我在 Rails 控制台中测试时,我能够通过验证,但是当我在 Postman 中输入这个 json 对象时,我得到了错误。这让我觉得我的问题一定出在控制器文件中,而不是模型文件中。 Json 参数:
  • {"name":"Jim Nobody", "email":"jim@nowhere.com", "password":"12345678", "password_confirmation":"12345678"}
  • 您可以查看 rails 服务器日志并发布示例请求吗?这通常包括发送到服务器的参数。
  • 您有password_digest 属性吗? has_secure_password 可能会失败:record.errors.add(:password, :blank) unless record.password_digest.present?

标签: ruby-on-rails validation authentication activerecord bcrypt


【解决方案1】:

您好,请检查您在控制器中的参数。目前您只传递参数。参数将是用户。只需尝试使用用户参数。

{“用户”:{“名称”:“测试”}}

【讨论】:

  • 就是这样!我来自前端的 JSON 对象需要包装在 user 哈希中。
  • {"user": {"name": "Somebody", "email": ".."...}}
【解决方案2】:

感谢 Rajkumar 的回答。最初,我的前端正在发送一个如下所示的 JSON 对象:

{
  "name": "Someone",
  "password": "a_password",
  ...
}

但 Rails 期待一个像这样被包裹在 user 散列中的东西:

{
  "user": {
    "name": "Somebody",
    "password": "a_password",
    ...
  }
}

谢谢大家的帮助!

【讨论】:

    【解决方案3】:

    我知道这很难直接回答您的问题,但在我看来,它会有所帮助。使用这个名为 byebug 的 gem。基本上,安装它,然后在用户保存到控制器之前放置byebug。当它执行代码时,它将挂起服务器,直到您在服务器选项卡中键入继续。在您键入 continue 之前,您可以像使用 rails 控制台一样使用服务器选项卡并调试参数的当前状态等等。希望这可以帮助您调试问题。

    【讨论】:

    • 谢谢!我发现当我检查我的 user.password 时,它是空的,即使我正在传递它。实际上,我需要将所有 json 参数包装在一个更大的“用户”参数中,以便 Rails 端能够识别它们。
    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多