Rails强参数 - 即使允许作为正确的类型

时间:2018-03-27 10:11:21

标签: ruby-on-rails strong-parameters

使用Ruby on Rails(5.1.4),我试图将一个ID数组传递给控制器​​,同时可选择将数组嵌套在一个带有控制器名称的哈希中。我的params方法如下:

  def operator_params
    params.fetch(:operator, {}).permit(ids: [])
  end

附加到请求的示例JSON主体可能是(虽然我也尝试将数组放入URL中):

{
    "ids": ["asd"]
}

Rails会看到参数Parameters: {"ids"=>["asd"], "id"=>"570158bb-428d-4e55-b55a-a94d1515c24a", "operator"=>{}},但仍会过滤掉它们。

ap operator_params的结果是{}

我错过了一些明显的东西吗?

奇怪的是我在我的应用程序的其他地方使用了类似的逻辑:params.fetch(:flight, {}).permit(..., :ids),它甚至没有声明通常需要的数组类型,但工作正常。

更新:我对.fetch的理解似乎有些偏差,应该是:

def operator_params
  params.fetch(:operator, params).permit(ids: [])
end

哪个 允许您提交{"operator": {"ids": []}}{"ids": []}并接受其中之一。但是,这似乎仍然不适用于阵列。此方法将接受前者(嵌套在operator下),而:

def operator_params
  params.permit(ids: [])
end
正如你所料,

会接受后者(没有嵌套)。根据{{​​3}}上的说明,包含第二个参数(即params),如果缺少operator密钥,则会使用该值,因此工作。

2 个答案:

答案 0 :(得分:0)

参数:{" ids" => [" asd"]," id" =>" 570158bb-428d-4e55-b55a -a94d1515c24a"," operator" => {}}

将其更改为

参数:{" ids" => [" asd"," {" id" => " 570158bb-428d-4e55-b55a-a94d1515c24a"}"," {" operator" => {}}"]}

答案 1 :(得分:0)

这是由于你的params包含operator

的空哈希值

将params值传递为

{ "operator"=> { "ids"=>["asd"], "id"=>"570158bb-428d-4e55-b55a-a94d1515c24a" } }