如何使用Ruby或Rails从URL中提取URL参数?
我有一些url,比如
http://www.example.com/something?param1=value1¶m2=value2¶m3=value3
我想从这些URL中提取参数并将它们放在哈希中。 显然,我可以使用正则expression式,但我只是想知道是否有更容易的方法来做到这一点与Ruby或Rails。 我还没有在Ruby模块URI
find任何东西,但也许我错过了一些东西。
事实上,我需要一个方法来做到这一点:
extract_parameters_from_url("http://www.example.com/something?param1=value1¶m2=value2¶m3=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¶m2=value2¶m3=value3')
回报
{"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]}
我发现自己最近的项目需要同样的东西。 build立在Levi的解决scheme基础上,这是一个更清洁,更快速的方法:
Rack::Utils.parse_nested_query 'param1=value1¶m2=value2¶m3=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.parse
和CGI.parse
结合起来(即使Rails / Rack等不需要,也可以使用)。
CGI.parse(URI.parse(url).query) # => {"name1" => ["value1"], "name2" => ["value1", "value2", ...] }
有不止一个方法,来解决你的问题。 其他人向你展示了一些技巧。 我知道另一个窍门。 这是我的尝试:
require 'uri' url = "http://www.example.com/something?param1=value1¶m2=value2¶m3=value3" uri = URI(url) # => #<URI::HTTP:0x89e4898 URL:http://www.example.com/something?param1=value1¶m2=value2¶m3=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¶m2=value2¶m3=value3") uri.query_values['param1'] => 'value1'
(它也显然处理参数编码/解码,不像URI)
在你的Controller中,你应该能够访问一个名为params
的字典(hash)。 因此,如果您知道每个查询参数的名称是什么,那么只需执行params[:param1]
即可访问它…如果您不知道参数的名称是什么,则可以遍历字典并获取键。
一些简单的例子。