如何使用Ruby或Rails从URL中提取URL参数?

我有一些url,比如

http://www.example.com/something?param1=value1&param2=value2&param3=value3 

我想从这些URL中提取参数并将它们放在哈希中。 显然,我可以使用正则expression式,但我只是想知道是否有更容易的方法来做到这一点与Ruby或Rails。 我还没有在Ruby模块URIfind任何东西,但也许我错过了一些东西。

事实上,我需要一个方法来做到这一点:

 extract_parameters_from_url("http://www.example.com/something?param1=value1&param2=value2&param3=value3") #=> {:param1 => 'value1', :param2 => 'value2', :param3 => 'value3'} 

你会有一些build议吗? 提前致谢。

朱利安

我想你想把任何给定的URLstring变成HASH?

您可以尝试http://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075

 require 'cgi' CGI::parse('param1=value1&param2=value2&param3=value3') 

回报

 {"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]} 

我发现自己最近的项目需要同样的东西。 build立在Levi的解决scheme基础上,这是一个更清洁,更快速的方法:

 Rack::Utils.parse_nested_query 'param1=value1&param2=value2&param3=value3' # => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"} 

只是利用上面的Levi答案改进 –

 Rack::Utils.parse_query URI("http://example.com?par=hello&par2=bye").query 

对于像上面的url这样的string,它会返回

 { "par" => "hello", "par2" => "bye" } 

对于一个纯粹的Ruby解决scheme,将URI.parseCGI.parse结合起来(即使Rails / Rack等不需要,也可以使用)。

 CGI.parse(URI.parse(url).query) # => {"name1" => ["value1"], "name2" => ["value1", "value2", ...] } 

有不止一个方法,来解决你的问题。 其他人向你展示了一些技巧。 我知道另一个窍门。 这是我的尝试:

 require 'uri' url = "http://www.example.com/something?param1=value1&param2=value2&param3=value3" uri = URI(url) # => #<URI::HTTP:0x89e4898 URL:http://www.example.com/something?param1=value1&param2=value2&param3=value3> URI::decode_www_form(uri.query).to_h # if you are in 2.1 or later version of Ruby # => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"} Hash[URI::decode_www_form(uri.query)] # if you are below 2.1 version of Ruby # => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"} 

阅读::decode_www_form的方法::decode_www_form

查看可寻址的 gem – Ruby的URI模块的stream行替代品,使查询分析变得简单:

 require "addressable/uri" uri = Addressable::URI.parse("http://www.example.com/something?param1=value1&param2=value2&param3=value3") uri.query_values['param1'] => 'value1' 

(它也显然处理参数编码/解码,不像URI)

在你的Controller中,你应该能够访问一个名为params的字典(hash)。 因此,如果您知道每个查询参数的名称是什么,那么只需执行params[:param1]即可访问它…如果您不知道参数的名称是什么,则可以遍历字典并获取键。

一些简单的例子。