我想对查询参数进行一些清理。
我用CGI.parse
解析查询,然后我删除了一些参数,但我找不到相反的方法来构建查询。
我真的不想做像
这样的事情params.map{|n,v| "#{CGI.escape n}=#{CGI.escape v.to_s}"}.join("&")
必须有一种更简单的方法。有吗?
答案 0 :(得分:6)
URI模块中有一个很好的方法:
require 'uri'
URI.encode_www_form("q" => "ruby", "lang" => "en") #=> "q=ruby&lang=en"
答案 1 :(得分:3)
如果你正在使用Rails(或者不介意拉入ActiveSupport),那么你可以使用to_param
(AKA to_query
):
{ :a => '&', :b => 'Where is pancake house?', :c => ['an', 'array'] }.to_param
# a=%26&b=Where+is+pancake+house%3F&c%5B%5D=an&c%5B%5D=array
to_param
处理数组的方式与您的版本略有不同,它会推出c[]=an&c[]=array
而不仅仅是c=an&c=array
。
答案 2 :(得分:2)
虽然没有更好的答案,但我会提出我现在正在使用的方法。
def build_query(params)
params.map do |name,values|
values.map do |value|
"#{CGI.escape name}=#{CGI.escape value}"
end
end.flatten.join("&")
end
答案 3 :(得分:0)
我不确定以下是否是简化,但它避免扩展哈希的(键,值)对。
params.map{|qq| qq.map{|q| CGI.escape(q)}.join('=')}.join('&')