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

12

我想对查询参数进行一些净化。

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

我不想像这样做:

params.map{|n,v| "#{CGI.escape n}=#{CGI.escape v.to_s}"}.join("&")

一定有更简单的方法。有吗?

4个回答

9
URI模块中有一个很好的方法:
require 'uri'
URI.encode_www_form("q" => "ruby", "lang" => "en")  #=> "q=ruby&lang=en"

3
如果你正在使用Rails(或者不介意引入ActiveSupport),那么你可以使用to_param(又名to_query)方法。具体内容请参考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

虽然没有更好的答案,但我将提供我目前使用的方法。

def build_query(params)
  params.map do |name,values|
    values.map do |value|
      "#{CGI.escape name}=#{CGI.escape value}"
    end
  end.flatten.join("&")
end

0

我不确定以下是否是一个简化,但它避免了哈希表的(键,值)对的扩展。

params.map{|qq| qq.map{|q| CGI.escape(q)}.join('=')}.join('&')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接