密码参数未包含在强参数中

时间:2018-06-19 22:25:17

标签: ruby-on-rails

我在User类中使用具有has_secure_password的Bcrypt,并尝试使用用户名和密码创建新的User,但是密码参数虽然在我的强参数中是允许的,但无法通过。

这是我的User类:

class User < ApplicationRecord
  has_secure_password

  has_many :journals
end

这是用户控制器:

class Api::V1::UsersController < ActionController::API
  def index
    @users = User.all
    render json: @users.to_json(:include => :journals)
  end

  def create
    byebug
    @user = User.create(user_params)
  end

  private

  def user_params
    params.require(:user).permit(:username, :password)
  end
end

我正尝试使用以下方式发布新用户:

fetch('http://localhost:3001/api/v1/users', {
method: 'POST', 
headers: {Accept: 'application/json', "Content-Type": 
'application/json'}, 
body: JSON.stringify({username: 'Name', password: 'test'})})

在'create'中byebug中的结果是:

(byebug) params
<ActionController::Parameters {"username"=>"Name", "password"=>"test", 
"controller"=>"api/v1/users", "action"=>"create", "user"=> . 
{"username"=>"Name"}} permitted: false>
(byebug) user_params
<ActionController::Parameters {"username"=>"Name"} permitted: true> 

无论我如何尝试,都无法访问user_params中的密码参数来创建具有哈希密码的用户。

在终端的Rails控制台中,我可以创建一个用户,然后按预期对哈希进行哈希处理,然后可以使用正常的提取请求从API提取该用户信息,但是我无法使用强大的参数来创建用户邮政要求,我不知道为什么。

1 个答案:

答案 0 :(得分:4)

  

但是我不能使用强大的参数来创建具有Post请求的用户,而且我也不知道为什么。

主要是因为您没有正确使用强参数。

params.require(:user).permit(:username, :password)

这意味着您需要传递{user: {username: 'foo', password: 'bar'}}而不是{username: 'foo', password: 'bar'}(请参见嵌套?)。

但是,即使您没有通过params[:user][:username],它也会以一种神奇的方式存在。怎么样? ParamsWrapper,就是这样。

  

如果为:json格式启用ParamsWrapper,则不必发送这样的JSON参数:

{"user": {"name": "Konata"}}
     

您可以发送如下参数:

{"name": "Konata"}

是的,但是为什么password没有得到相同的待遇?我们在下面找到几行:

  

在未设置:include:exclude选项的Active Record模型中,它将仅包装类方法attribute_names返回的参数。

password不是模型中的属性/列,因此params包装器将忽略它。