Ruby on rails Rails强参数-无需所需密钥即可请求
我正在开发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 控制器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
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"
}
}