与Ruby的CGI.parse方法完全相反?

时间:2011-03-09 12:12:49

标签: ruby cgi

我想对查询参数进行一些清理。

我用CGI.parse解析查询,然后我删除了一些参数,但我找不到相反的方法来构建查询。

我真的不想做像

这样的事情
params.map{|n,v| "#{CGI.escape n}=#{CGI.escape v.to_s}"}.join("&")

必须有一种更简单的方法。有吗?

4 个答案:

答案 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('&')