如何将Hash连接到URL参数?

时间:2009-11-04 14:45:40

标签: ruby url

一个快速的Ruby问题:

params = {:q => "A query",:foo => "bar",:nasty => "Schrödinger's cat"}
p do_it(params)
=> q=A%20query&foo=bar&nasty=Schr%C3%B6dinger%27s+cat

(我想ö编码就是这样,请原谅我的错误)有没有比下面更简单的方法呢?:

def do_it(params)
  out = []
  params.each_pair{|key,val|
    out.push "#{CGI.escape(key.to_s)}=#{CGI.escape(val)}"
  }
  out.join("&")
end

我不打算以'最好'的方式开始一场战争 - 它只是这种方法看起来很像kludgey和非红宝石!有什么提示吗?

6 个答案:

答案 0 :(得分:21)

这是一种更短更有效的方法。

def parameterize(params)
  URI.escape(params.collect{|k,v| "#{k}=#{v}"}.join('&'))
end

答案 1 :(得分:6)

使用.to_param

params = {:q => "A query",:foo => "bar",:nasty => "Schrödinger's cat"}

params.to_param 
=> "foo=bar&nasty=Schr%C3%B6dinger%27s+cat&q=A+query" 

答案 2 :(得分:3)

Rails会为你做这件事。

params = {:ids => [1,2], :query => 'cheese'}
out = ActionController::Routing::Route.new.build_query_string(params)
=> "?ids%5B%5D=1&ids%5B%5D=2&query=cheese"

解码将是:“?ids [] = 1& ids [] = 2& query = cheese”

答案 3 :(得分:0)

您可以使用collect

使其更简单一些
def do_it(params)
  params.collect do |key,val|
    "#{CGI.escape(key.to_s)}=#{CGI.escape(val)}"
  end.join('&')
end

我不知道你可以简化多少。另请注意,CGI.escape会将空格转换为+,而非%20。如果你真的想要%20,请改用URI.escape(显然你必须require 'uri'。)

答案 4 :(得分:0)

我同意这是非常“非类似红宝石”的代码。虽然它并没有好多少,但我认为requiretify()可能就是你想要的:

http://www.koders.com/ruby/fid4B642EE4A494A744ACC920A1BE72CFE66D1D2B97.aspx?s=cgi#L291

答案 5 :(得分:0)

您应该尝试以下

def to_query(key)
  "#{CGI.escape(key.to_s)}=#{CGI.escape(to_param.to_s)}"
end

rails documentation复制。不要忘记阅读方法定义上面的注释。