has_secure_password坚持密码未被发送

时间:2014-10-06 00:21:50

标签: ruby-on-rails ruby validation ruby-on-rails-4

我正在尝试使用bcrypt安全地存储用户的密码,而我正在使用has_secure_password方法来执行此操作。不幸的是,当我这样做时,它不断抛出一个验证错误,说我没有提供密码。

参数是通过JSON发送的(这是一个API应用程序),我正在我的控制器中创建用户,如下所示:

class UsersController < ApplicationController
  def create
    @user = User.create(user_params)
  end

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

我的用户模型如下:

class User < ActiveRecord::Base
  require 'securerandom'

  # Email and password must exist at all times
  validates :email, presence: true

  # Email must be unique and a valid email address
  validates :email, uniqueness: true
  validates :email, email_format: { message: "Email address doesn't look like an email address" }

  # Password must be a minimum of 6 characters
  # validates :password, length: { minimum: 6 }

  # Password reset code and auth token must be unique
  validates :password_reset_code, :auth_token, uniqueness: true, allow_nil: true

  # Use secure password hashing with bcrypt
  has_secure_password

  # Create a new auth token after creation, this is so they can log in automatically
  before_create :generate_auth_token

  def generate_auth_token
    self.auth_token = SecureRandom.hex(32)
  end
end

现在,我正在向控制器操作create发送一个API请求,其中包含以下有效内容:

{"email": "someguy@gmail.com", "password": "testing", "password_confirmation": "testing"}

但总是回来的验证错误是密码不能为空。我知道这与has_secure_password有关,因为我之前没有它就有这个工作。另外,如果我将控制器方法更改为:

def create
  @user = User.create(email: "someguy@gmail.com", password: "testing", password_confirmation: "testing")
end

它完美无缺,我在数据库中使用安全密码创建了一个用户。

为什么我的password参数似乎迷失了?

1 个答案:

答案 0 :(得分:2)

您的控制器正在寻找params散列中的用户密钥,它看起来不像您正在发送一个

尝试将创建有效负载设置为

 { "user": { "email":"someguy@gmail.com", 
             "password": "testing", 
             "password_confirmation": "testing" }
 }