首页 > 解决方案 > Rails 6,转换嵌套强参数的最佳实践

问题描述

在 Rails 6 上,我向 ProductsController 发送 JSON 请求,我以这种方式定义了我的强参数策略:

def product_params
  params.require(:offer).permit(:title, products: [:uuid, :item_name])
end

如果我在控制器中打印方法:

puts product_params  

我可以看到:

  <ActionController::Parameters {
   "title" => "some title",
   "products"=>[
     <ActionController::Parameters {"uuid"=>"9u35ui3oj562", "item_name"=>"Blue Bike"} 
          permitted: true>,
     <ActionController::Parameters {"uuid"=>"98f9541ef310","item_name"=>"Pink 
    Skates"} permitted: true>
]} permitted: true>

因此正确采用了 JSON。现在我“拿出”我的产品:

tmp = product_params['products']

我尝试将它们转换为常规哈希:

new_array_of_hashes = tmp.map(&:to_h)

但我得到了错误:

 ActionController::UnfilteredParameters (unable to convert unpermitted parameters to hash)

为什么?显然products数组中的所有对象都有“permitted: true”标志。

 new_array_of_hashes = tmp.map(&:to_unsafe_hash)

产生相同的错误信息。

奇怪的是,如果我在控制器的强参数方法中进行转换:

 def product_params
    params.require(:offer).permit(:title, products: [:uuid, :item_name]).to_h
 end 

它完美地工作。有什么不同?

标签: ruby-on-railsstrong-parameters

解决方案


推荐阅读