如何将Hash连接到URL参数?

JP.*_*JP. 6 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
Run Code Online (Sandbox Code Playgroud)

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

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

我不打算以"最佳"的方式开始一场战争 - 它只是这种方法看起来很像kludgey和非红宝石一样!有小费吗?

Mic*_*rds 21

这是一种更短,更有效的方法.

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

  • 一定要用`URI.escape`而不是`CGI.escape`来使用它,因为后者会将`=`变成'%3D`. (2认同)

Pet*_*sen 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" 
Run Code Online (Sandbox Code Playgroud)