Rails:Hash#to_param的相反操作

15
如果我将一个哈希表转换成查询字符串,那么如何将其再次转换回来呢?
{:filters => {:colour => ['Red', 'Blue'], :size => 'Medium'}}.to_param
=> "filters[colour][]=Red&filters[colour][]=Blue&filters[size]=Medium"
Rails 在填充 params 哈希表时似乎会自动执行此操作,但是否可以直接调用该方法呢?
谢谢。
2个回答

31

你需要使用Rack::Utils.parse_nested_query(query),它会将其转换为一个Hash。你可以使用以下代码获取:

```ruby Rack::Utils.parse_nested_query(query) ```
require 'rack/utils'

Rack::Utils.build_nested_query('filters[colour][]=Red&filters[colour][]=Blue&filters[size]=Medium') 的结果是 ArgumentError: value must be a Hash。我做错了什么? - gjb
啊,我看到你编辑了你的回答。parse_nested_query 完美地工作了,谢谢! - gjb
@gjb:是的,抱歉我的错,我总是把这两个搞混。 - Ryan Bigg
空值不会被保留,它们将被替换为空字符串: Rack::Utils.parse_nested_query({foo: nil}.to_param) => {"foo"=>""} - André Laszlo

1
query_string = "filters[colour][]=Red&filters[colour][]=Blue&filters[size]=Medium"
CGI::parse(query_string)

1
不错,但还不够好。这个程序没有生成一个包含过滤器键的哈希表,而这个键对应的哈希表中又有一个颜色键,它的值是一个数组... 这正是 Rack::Utils.parse_nested_query 所做的。 - Ryan Bigg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接