我在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提取该用户信息,但是我无法使用强大的参数来创建用户邮政要求,我不知道为什么。
答案 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包装器将忽略它。