你如何使用 Rails 5.2 wrap_parameters?

Jos*_*osh 5 api json ruby-on-rails

我有一个仅作为 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
Run Code Online (Sandbox Code Playgroud)
# config/initializers/wrap_parameters.rb

ActiveSupport.on_load(:action_controller) do
  wrap_parameters format: [:json]
end
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

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

我曾尝试将wrap_parameters Userand 和wrap_parameters :userandwrap_parameters format: [:json]直接添加到 ,users_controller.rb但这没有任何作用。

我究竟做错了什么?

Cha*_*rma 0

这是因为参数白名单。

 def user_params
   params.require(:user).permit(:email, :password, :is_admin, :is_agent)
 end
Run Code Online (Sandbox Code Playgroud)

这里,需要用户密钥。从安全角度来看,RoR 中将参数列入白名单是一个很好的功能

如果您只写 params.permit(:email, :password, :is_admin, :is_agent),那么您相同的请求将起作用,但不建议删除用户对象。

  • 阅读文档后,我的印象是“wrap_parameters”模块的全部要点是它自动用类对象包装您的参数。从文档中:`如果您为 :json 格式启用 ParamsWrapper,则不必像这样发送 JSON 参数:{"user": {"name": "Konata"}} 您可以像这样发送参数:{"name" :“科纳塔”}` (3认同)