我似乎遇到了和本章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方式'是什么?
答案 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"