强大的参数不允许动态密钥

时间:2014-05-22 20:26:42

标签: ruby-on-rails strong-parameters

我的控制器正在接收这个参数

{"utf8"=>"✓",
 "_method"=>"patch",
 "authenticity_token"=>"r5KaLCrb1PR//q4HZ0p30dUeK1OHE7cjtoken=",
 "servidor"=>
  {"nome"=>"USER NAME",
   "tipo"=>"1",
   "lotacao_ids"=>{"1"=>["", "86", "13"], "2"=>["", "86"], "3"=>["", "66","103","69"]},
   "contatos_attributes"=>{"0"=>{"telefone"=>"9229-8396 ", "id"=>"453"}},
   "matricula"=>"8741883",
   "cpf"=>"16450724870"},
 "action"=>"update",
 "controller"=>"servidores",
 "id"=>"238"}

但经过

之后
params.require(:servidor).permit(:nome, :tipo, :matricula, :cpf, :contatos_attributes=>[:telefone,:id],:lotacao_ids=>{})

结果

{"nome"=>"USER NAME",
 "tipo"=>"1",
 "matricula"=>"8741883",
 "cpf"=>"16450724870",
 "contatos_attributes"=>{"0"=>{"telefone"=>"9229-8396 ", "id"=>"453"}},
 "lotacao_ids"=>{}}

我如何能够lotacao_ids收到我的参数lotacao_ids=>{1=>86, 2=>86, 3=>66} TNKS

在@phoet

的帮助下回答
     def servidor_params
       params.require(:servidor).permit(:nome, :tipo, :matricula, :cpf, :contatos_attributes=>[:telefone,:id]).tap do |whitelisted|        
         whitelisted["lotacao_ids"] = params[:servidor]["lotacao_ids"]
       end
     end

1 个答案:

答案 0 :(得分:3)

你想要做的事情违背了强参数的想法,因为你基本上无法控制lotacao_ids的哈希值。

  

请注意,如果在指向哈希的键中使用permit,则不会   允许所有哈希。您还需要指定内部的属性   哈希应该列入白名单。

你给出的参数的一部分作为一个例子表明这实际上应该是一个id数组而不是一个哈希?

在任何情况下,如果您不关心该字段的内容,您仍然可以将其合并到您在首先允许内容后获得的哈希值中。它仍然只是一个哈希...