解析一个字符串就好像它是Ruby on Rails中的查询字符串一样

时间:2010-05-05 11:38:29

标签: ruby-on-rails parsing query-string

我有一个这样的字符串:

"foo=bar&bar=foo&hello=hi"

Ruby on Rails是否提供了解析它的方法,就像它是一个查询字符串一样,所以我得到一个像这样的哈希:

{
    :foo => "bar",
    :bar => "foo",
    :hello => "hi"
}

或者我必须自己写吗?

修改

请注意,上面的字符串不是来自URL的真实查询字符串,而是存储在来自Facebook Connect的cookie中的字符串。

5 个答案:

答案 0 :(得分:148)

答案取决于您使用的Rails版本。如果您使用的是2.3或更高版本,请使用Rack的内置解析器for params

 Rack::Utils.parse_nested_query("a=2") #=> {"a" => "2"}

如果你使用旧的Rails,你确实可以使用CGI::parse。请注意,散列和数组的处理在模块之间有细微差别,因此您需要验证所获得的数据对于您选择的方法是否正确。

您还可以在课程中加入Rack::Utils以便进行速记访问。

答案 1 :(得分:32)

CGI::parse("foo=bar&bar=foo&hello=hi")

给你

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}

答案 2 :(得分:8)

编辑:如评论中所述,如果有人想要伤害您,symolizing键可以让您的服务器停机。当我在低调应用程序上工作时,我仍然会做很多事情,因为它使事情变得更容易,但我不会再为高利益应用程序做这件事了

不要忘记用符号表示获得所需结果的键

Rack::Utils.parse_nested_query("a=2&b=tralalala").deep_symbolize_keys

此操作对重复操作具有破坏性。

答案 3 :(得分:8)

如果您正在谈论用于获取有关参数的数据的网址

> request.url
=> "http://localhost:3000/restaurants/lokesh-dhaba?data=some&more=thisIsMore"

然后获取查询参数。使用

> request.query_parameters
=> {"data"=>"some", "more"=>"thisIsMore"}

答案 4 :(得分:1)

如果您想要哈希,可以使用

Hash[CGI::parse(x).map{|k,v| [k, v.first]}]