【问题标题】:password param not being included in strong params密码参数未包含在强参数中
【发布时间】:2018-06-19 22:25:16
【问题描述】:

我在我的用户类中使用带有 has_secure_password 的 Bcrypt,并尝试使用用户名和密码创建一个新用户,但密码参数虽然在我的强参数中允许,但没有通过。

这是我的用户类:

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 获取该用户信息,但我不能使用强参数来创建一个用户一个 Post 请求,我不知道为什么。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    但是我不能使用强参数来创建一个带有 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 包装器会忽略它。

    【讨论】:

    • @robert 有帮助吗?
    • 谢谢!这完美地解释了它。我不知道 ParamsWrapper,并认为我遗漏了有关如何使用 has_secure_password 的内容。
    • 我问的第一个问题,没有意识到我必须这样做。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多