使用多个重复密钥编码参数

时间:2016-01-15 14:12:52

标签: ruby-on-rails ruby

我似乎遇到了和本章here

相同的问题

我想编码一些参数(对于import.io api)。有效:

params = {
  :input => "webpage/url:http://www.example.com",
  :input => "keywords:some+keywords"

}

但这不起作用,所以我认为这是正确的方法:

params = { :input => ["webpage/url:http://www.example.com", "keywords:some+keywords"] }

我希望它输出

params.to_query
=> "input=webpage%2Furl%3Ahttp%3A%2F%2Fwww.example.com%2Fsome-id&input=keywords%3Asome%2Bkeywords"

不幸的是,我得到了

"input%5B%5D=webpage%2Furl%3Ahttp%3A%2F%2Fwww.example.com%2Fsome-id&input%5B%5D=keywords%3Asome%2Bkeywords"

在输入后添加[],我认为这是标准行为。我怎么能阻止它呢?

澄清一下,处理需要重复键的url参数的ruby或'rails方式'是什么?

2 个答案:

答案 0 :(得分:1)

网址中的某些字符对网址的处理特别重要:它们是保留,就像编程语言中的关键字一样。见Which characters make a URL invalid?

如果您尝试将这些作为参数的名称或值使用,它将破坏uri,您将很难预测您所看到的结果。

答案是 URI转义字符串,它将用其编码版本替换特殊字符。 Rails会在收到请求后自动取消它们,因此您不必担心它。

你可以手动转义它们,但最好的方法是,如果你已经将它们作为哈希,就是在哈希上调用.to_param

params = { :input => ["webpage/url:http://www.example.com", "keywords:some+keywords"] }
=> {:input=>["webpage/url:http://www.example.com", "keywords:some+keywords"]}
params.to_param
=> "input%5B%5D=webpage%2Furl%3Ahttp%3A%2F%2Fwww.example.com&input%5B%5D=keywords%3Asome%2Bkeywords"

答案 1 :(得分:0)

遇到类似的问题,这里有一个有用的帖子Ruby Hash with duplicate keys?,但简要

params = {}.compare_by_identity
params['input'] = "webpage/url:http://www.example.com"
params['input'.dup] = "keywords:some+keywords"

然后

params.to_query

返回

"input=keywords%3Asome%2Bkeywords&input=webpage%2Furl%3Ahttp%3A%2F%2Fwww.example.com"