我有一个仅作为API构建的Rails 5.2应用程序。我正在使用Postman来测试端点。目前,我正在使用根元素包装我的所有JSON POSTS,以使其传递“强参数”。但是,根据Rails文档,wrap_parameters
设置为接受JSON,我不应该这样做,但是,如果我不这样做,我的POST就会失败。我做错了什么?
# users_controller.rb
class UsersController < ApplicationController
before_action :set_user, only: [:show, :update, :destroy]
.....
# POST /users
def create
@user = User.new(user_params)
if @user.save
render json: @user, status: :created, location: @user
else
render json: @user.errors, status: :unprocessable_entity
end
end
.....
private
.....
# Only allow a trusted parameter "white list" through.
def user_params
params.require(:user).permit(:email, :password, :is_admin, :is_agent)
end
end
# config/initializers/wrap_parameters.rb
ActiveSupport.on_load(:action_controller) do
wrap_parameters format: [:json]
end
如果我将JSON包装在user
中它可以正常工作,但是,根据Rails文档,我不应该这样做。
http://api.rubyonrails.org/v5.2.0/classes/ActionController/ParamsWrapper.html
我尝试将wrap_parameters User
和wrap_parameters :user
以及wrap_parameters format: [:json]
直接添加到users_controller.rb
但是没有做任何事情。
我做错了什么?
答案 0 :(得分:0)
这是因为参数白名单。
def user_params
params.require(:user).permit(:email, :password, :is_admin, :is_agent)
end
此处需要用户密钥。从安全角度来看,它是RoR中的一个很好的功能,可以将参数列入白名单
如果您只编写params.permit(:email, :password, :is_admin, :is_agent)
,那么您可以使用相同的请求,但不建议删除用户对象。
答案 1 :(得分:0)
我明白了。我必须将wrap_parameters :user, include: %i[email password is_admin is_agent]
添加到Users控制器,如下所示:
# users_controller.rb
class UsersController < ApplicationController
before_action :set_user, only: [:show, :update, :destroy]
wrap_parameters :user, include: %i[email password is_admin is_agent]
.....
# POST /users
def create
@user = User.new(user_params)
if @user.save
render json: @user, status: :created, location: @user
else
render json: @user.errors, status: :unprocessable_entity
end
end
.....
private
.....
# Only allow a trusted parameter "white list" through.
def user_params
params.require(:user).permit(:email, :password, :is_admin, :is_agent)
end
end
我仍然不完全理解为什么,但是,它有效。文档暗示这应该通过wrap参数模块自动发生。