扩展 Julie 的答案以实现编码值的字符串而不是哈希。
随着URI.encode 的贬值,可以使用ERB::Util.url_encode 实现此目的,但是您只需编码键和值对,而不是完整参数,然后将它们连接在一起。
params = { name: 'John Key' }
# not what we want
ERB::Util.url_encode(params) # => "%7B%3Aname%3D%3E%22John%20Key%22%7D"
这里有一个(相当长的)命令可以工作:
# Construct a new object (a string here) and build our params into it correctly.
# k = key of hash.
# v = value of hash.
# a = array created in each_with_object.
params.each_with_object([]) { |(k, v), a| a << [ERB::Util.url_encode(k), ERB::Util.url_encode(v)].join('=') }.join('&')
# => "name=John%20Key"
更多参数:
params = { name: 'John Key', occupation: 'Web Developer!', 'Bad Key' => 'but works' }
params.each_with_object([]) { |(k, v), a| a << [ERB::Util.url_encode(k), ERB::Util.url_encode(v)].join('=') }.join('&')
# => "name=John%20Key&occupation=Web%20Developer%21&Bad%20Key=but%20works"
与 Hash.to_query 相比
params.to_query
# => "Bad+Key=but+works&name=John+Key&occupation=Web+Developer%21"