在Python中,我可以这样做:
>>> import urlparse, urllib
>>> q = urlparse.parse_qsl("a=b&a=c&d=e")
>>> urllib.urlencode(q)
'a=b&a=c&d=e'
在Ruby [+ Rails]中我无法弄清楚如何在没有“滚动我自己”的情况下做同样的事情,这看起来很奇怪。 Rails方式对我不起作用 - 它为查询参数的名称添加方括号,另一端的服务器可能支持也可能不支持:
>> q = CGI.parse("a=b&a=c&d=e")
=> {"a"=>["b", "c"], "d"=>["e"]}
>> q.to_params
=> "a[]=b&a[]=c&d[]=e"
我的用例很简单,我希望查看URL query-string
部分中某些值的值。依靠标准库和/或Rails似乎很自然,写下这样的东西:
uri = URI.parse("http://example.com/foo?a=b&a=c&d=e")
q = CGI.parse(uri.query)
q.delete("d")
q["a"] << "d"
uri.query = q.to_params # should be to_param or to_query instead?
puts Net::HTTP.get_response(uri)
但仅限于结果URI实际上是http://example.com/foo?a=b&a=c&a=d
,而不是http://example.com/foo?a[]=b&a[]=c&a[]=d
。是否有正确或更好的方法来做到这一点?
答案 0 :(得分:27)
在现代红宝石中,这很简单:
require 'uri'
URI.encode_www_form(hash)
答案 1 :(得分:5)
这是一个将哈希变为查询参数的快速函数:
require 'uri'
def hash_to_query(hash)
return URI.encode(hash.map{|k,v| "#{k}=#{v}"}.join("&"))
end
答案 2 :(得分:2)
快速哈希到网址查询欺骗:
"http://www.example.com?" + { language: "ruby", status: "awesome" }.to_query
# => "http://www.example.com?language=ruby&status=awesome"
想要反过来吗?使用CGI.parse:
require 'cgi'
# Only needed for IRB, Rails already has this loaded
CGI::parse "language=ruby&status=awesome"
# => {"language"=>["ruby"], "status"=>["awesome"]}
答案 3 :(得分:0)
rails处理该类型查询字符串的方式意味着您必须像自己一样滚动自己的解决方案。如果您正在处理非rails应用程序,这有点不幸,但如果您要在rails应用程序之间传递信息,那就很有意义。
答案 4 :(得分:-1)
作为一个简单的普通Ruby解决方案(或者我的案例中的RubyMotion),只需使用:
class Hash
def to_param
self.to_a.map { |x| "#{x[0]}=#{x[1]}" }.join("&")
end
end
{ fruit: "Apple", vegetable: "Carrot" }.to_param # => "fruit=Apple&vegetable=Carrot"
它只处理简单的哈希值。