我有一个这样的字符串:
"foo=bar&bar=foo&hello=hi"
Ruby on Rails是否提供了解析它的方法,就像它是一个查询字符串一样,所以我得到一个像这样的哈希:
{
:foo => "bar",
:bar => "foo",
:hello => "hi"
}
或者我必须自己写吗?
请注意,上面的字符串不是来自URL的真实查询字符串,而是存储在来自Facebook Connect的cookie中的字符串。
答案 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]}]