你如何使用Rails 5.2 wrap_parameters?

时间:2018-06-01 10:44:52

标签: ruby-on-rails json api

我有一个仅作为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

enter image description here

如果我将JSON包装在user中它可以正常工作,但是,根据Rails文档,我不应该这样做。

http://api.rubyonrails.org/v5.2.0/classes/ActionController/ParamsWrapper.html

我尝试将wrap_parameters Userwrap_parameters :user以及wrap_parameters format: [:json]直接添加到users_controller.rb但是没有做任何事情。

我做错了什么?

2 个答案:

答案 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参数模块自动发生。