Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将具有表示嵌套的键的哈希转换为嵌套哈希_Ruby On Rails_Ruby_Hash - Fatal编程技术网

Ruby on rails 如何将具有表示嵌套的键的哈希转换为嵌套哈希

Ruby on rails 如何将具有表示嵌套的键的哈希转换为嵌套哈希,ruby-on-rails,ruby,hash,Ruby On Rails,Ruby,Hash,我需要转换以下哈希: { "item[0][size]" => "12", "item[0][count]" => "1" } 为此: { "item": { "0": { "size": "12", "count": "1" } } } 你能就如何最优雅地实现这一目标提出建议吗?也许我可以重用一些ActionPack的实用方法来解析参数字符串?经过一些研究,我找到了一种解析嵌套查询键的方法,使用: 因此,现在可以做

我需要转换以下哈希:

{
  "item[0][size]" => "12",
  "item[0][count]" => "1"
}  
为此:

{
  "item": {
    "0": {
      "size": "12",
      "count": "1"
    }
  }
}  

你能就如何最优雅地实现这一目标提出建议吗?也许我可以重用一些ActionPack的实用方法来解析参数字符串?

经过一些研究,我找到了一种解析嵌套查询键的方法,使用:

因此,现在可以做到:

items_string = item_hash.to_a.map { |row| row.join('=') }.join('&')
result = Rack::Utils.parse_nested_query(items_string)

=> {
  "item" => {
    "0" => {
       "size" => "12",
      "count" => "1"
    }
  }
}

您可以重用
rack
lib方法


找到。

您尝试过什么吗?尝试过搜索actionpack的代码库并尝试过
CGI::parse('item[0][size]=12')
但它没有解析嵌套的键字符串该哈希的来源是什么?在那里修复它而不是构建一个解决方案可能是有意义的。@Spickerman散列的源是一个CSV文件。为了表示嵌套对象的值,我必须使用一些约定,并考虑使用与嵌套参数键相同的方法。@。很好,但这并不能满足你的要求。请保持一致。@sawa,已将预期结果更新为字符串作为值。但我一直在寻找一个将嵌套键转换为哈希的方法,我发现了这个方法。不仅要考虑值,还要考虑键。请注意,这很接近,但与OP要求的内容不同。@sawa是的,但我的答案基于OP注释。是的,不清楚OP问了什么。
items_string = item_hash.to_a.map { |row| row.join('=') }.join('&')
result = Rack::Utils.parse_nested_query(items_string)

=> {
  "item" => {
    "0" => {
       "size" => "12",
      "count" => "1"
    }
  }
}
require "rack"
def p p
  Rack::Utils.parse_nested_query(p)                                               
end
p 'item[0][size]=12' # => {"item"=>{"0"=>{"size"=>"12"}}}