相当于Rack :: Utils.build_query,它使用%20(而不是+)作为空格

时间:2013-10-27 22:07:29

标签: ruby

我正在寻找一个将哈希转换为查询字符串的函数。我知道Rack::Utils.build_query但它使用+作为空格。

2 个答案:

答案 0 :(得分:0)

build_query使用Rack::Utils.escape,用+字符替换空格。您可以添加使用Rack::Utils.escape_path的build_query版本,例如

module Rack::Utils
  def your_build_query(params)
    params.map { |k, v|
      if v.class == Array
        build_query(v.map { |x| [k, x] })
      else
        v.nil? ? escape_path(k) : "#{escape_path(k)}=#{escape_path(v)}"
      end
    }.join("&")
  end
end

但所有escape_path(s)的确都是escape(s).gsub('+', '%20'),因此您只需致电Rack::Utils.build_query(s).gsub('+', '%20')

答案 1 :(得分:0)

你看过URI::encode_www_form了吗?它内置于Ruby中。

来自文档:

URI.encode_www_form([["q", "ruby"], ["lang", "en"]])
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => "ruby", "lang" => "en")
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")
#=> "q=ruby&q=perl&lang=en"
URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])
#=> "q=ruby&q=perl&lang=en"

关于使用%20+的问题,请参阅“When to encode space to plus (+) or %20?”。