Ruby on rails Rails强参数-无需所需密钥即可请求

Ruby on rails Rails强参数-无需所需密钥即可请求,ruby-on-rails,rspec,strong-parameters,Ruby On Rails,Rspec,Strong Parameters,我正在开发Rails API,并在控制器中使用强参数。我有一个请求规范,它在一个模型上失败,但在所有其他模型上都有效。每个模型的控制器几乎都是一样的 正如您在规范中看到的,请求主体应该是{tag:{name:a good name}。但是,此规范使用的{name:a good name}应该是无效的,因为它缺少标记键。相同控制器功能的相同规范适用于许多其他型号 另一个有趣的变化是,如果我将控制器的强参数更改为params.require:not_tag.permit:name,它会因为没有包含n

我正在开发Rails API,并在控制器中使用强参数。我有一个请求规范,它在一个模型上失败,但在所有其他模型上都有效。每个模型的控制器几乎都是一样的

正如您在规范中看到的,请求主体应该是{tag:{name:a good name}。但是,此规范使用的{name:a good name}应该是无效的,因为它缺少标记键。相同控制器功能的相同规范适用于许多其他型号

另一个有趣的变化是,如果我将控制器的强参数更改为params.require:not_tag.permit:name,它会因为没有包含not_tag键而抛出一个错误

Ruby:2.6.5p114 轨道:6.0.1 预期响应状态:422 收到回复状态:201 控制器

class TagsController < ApplicationController
  before_action :set_tag, only: [:show, :update, :destroy]

  # Other methods...

  # POST /tags
  def create
    @tag = Tag.new(tag_params)

    if @tag.save
      render "tags/show", status: :created
    else
      render json: @tag.errors, status: :unprocessable_entity
    end
  end

  # Other methods...

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_tag
      @tag = Tag.find_by(id: params[:id])
      if !@tag
        object_not_found
      end
    end

    # Only allow a trusted parameter "white list" through.
    def tag_params
      params.require(:tag).permit(:name)
    end

    # render response for objects that aren't found
    def object_not_found
      render :json => {:error => "404 not found"}.to_json, status: :not_found
    end
end

这种行为是因为Rails 6中默认启用的功能。wrap_参数将接收到的参数包装到嵌套哈希中。因此,这允许客户端发送请求,而无需在根元素中嵌套数据

例如,在名为Tag的模型中,它基本上会转换

{
  name: "Some name",
  age: "Some age"
}

但是,正如您在测试中看到的,如果您将所需的键更改为not_标记,那么包装会像预期的那样中断API调用


可以使用config/initializers/wrap_parameters.rb文件更改此配置。在该文件中,您可以将wrap_parameters format:[:json]设置为wrap_parameters format:[]以禁止此类参数包装。

此行为是因为Rails 6中默认启用的功能。wrap_参数将接收到的参数包装到嵌套哈希中。因此,这允许客户端发送请求,而无需在根元素中嵌套数据

例如,在名为Tag的模型中,它基本上会转换

{
  name: "Some name",
  age: "Some age"
}

但是,正如您在测试中看到的,如果您将所需的键更改为not_标记,那么包装会像预期的那样中断API调用


可以使用config/initializers/wrap_parameters.rb文件更改此配置。在该文件中,您可以将wrap_parameters format:[:json]设置为wrap_parameters format:[]以禁止此类参数包装。

这正是问题所在。无论出于什么原因,我的脑海中都有这样一个想法:强参数取代了参数包装。但这在技术上根本没有意义。更糟糕的是,由于所有其他控制器的同一规范写得不正确,导致了混乱。所以他们通过了,即使他们不应该通过。这正是问题所在。无论出于什么原因,我的脑海中都有这样一个想法:强参数取代了参数包装。但这在技术上根本没有意义。更糟糕的是,由于所有其他控制器的同一规范写得不正确,导致了混乱。所以他们是路过的,尽管他们不应该。
{
  tag:
    {
      name: "Some name",
      age: "Some age"
    }
}