强参数不允许使用动态密钥



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

{"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}秋明石油公司

在@ photo的帮助下回答

     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

你想做的是违背强参数的想法,因为你基本上无法控制lotacao_ids哈希中的内容。

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

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

在任何情况下,如果您不关心该字段的内容,您仍然可以将其合并到您首先允许内容后得到的散列中。

最新更新