我有一个像这样的字符串:
"foo=bar&bar=foo&hello=hi"
Ruby on Rails是否提供将其解析为查询字符串的方法,所以我得到了这样的哈希:
{
:foo => "bar",
:bar => "foo",
:hello => "hi"
}
还是我必须自己写?
编辑
请注意,上面的字符串不是来自URL的真实查询字符串,而是来自Facebook Connect存储在cookie中的字符串。
Answers:
答案取决于您使用的Rails版本。如果您使用的是2.3或更高版本,请使用Rack的内置解析器获取参数
Rack::Utils.parse_nested_query("a=2") #=> {"a" => "2"}
如果您使用的是较旧的Rails,则可以使用CGI::parse
。请注意,哈希和数组的处理在模块之间的细微差别上是不同的,因此您需要验证所获取的数据对于所选方法是否正确。
您也可以将其包含Rack::Utils
在您的班级中以进行速记。
"a[]=&a[]=z"
为{"a[]"=>["", "z"]}
,无论ActionController::Base
返回使用的解析器是什么{:a => ["z"]}
的
CGI::parse("foo=bar&bar=foo&hello=hi")
给你
{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}
编辑:如评论中所述,如果有人想伤害您,则使用符号键可以使您的服务器瘫痪。在使用低配置的应用程序时,我仍然会做很多事情,因为它使操作变得更容易,但对于高风险的应用程序,我将不再做
不要忘记象征获得所需结果的键
Rack::Utils.parse_nested_query("a=2&b=tralalala").deep_symbolize_keys
此操作对重复项具有破坏性。
如果您谈论的是用于获取有关参数的数据的Urls,
> request.url
=> "http://localhost:3000/restaurants/lokesh-dhaba?data=some&more=thisIsMore"
然后获取查询参数。使用
> request.query_parameters
=> {"data"=>"some", "more"=>"thisIsMore"}
如果您想要哈希,可以使用
Hash[CGI::parse(x).map{|k,v| [k, v.first]}]
CGI.parse(query).transform_values(&:first)