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


78

我有一个像这样的字符串:

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

Ruby on Rails是否提供将其解析为查询字符串的方法,所以我得到了这样的哈希:

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

还是我必须自己写?

编辑

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

Answers:


163

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

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

如果您使用的是较旧的Rails,则可以使用CGI::parse。请注意,哈希和数组的处理在模块之间的细微差别上是不同的,因此您需要验证所获取的数据对于所选方法是否正确。

您也可以将其包含Rack::Utils在您的班级中以进行速记。


如果您想要获得Rails为您提供的params对象,则可以执行以下操作:params = ActionController :: Parameters.new(Rack :: Utils.parse_nested_query(“ a = 2”))
adailey

有谁知道是否有可能避免将查询字符串参数值转换为字符串?例如,我想要这种行为:```Rack :: Utils.raw_parse_nested_query(“ a = 2”)#=> {“ a” => 2}```
mecampbellsoup

1
尽管这在大多数情况下都是很好的:它解析"a[]=&a[]=z"{"a[]"=>["", "z"]},无论ActionController::Base返回使用的解析器是什么{:a => ["z"]}
杰里米·

36

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

给你

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

2
这是我尝试过的唯一处理每个参数的多个实例的实现-谢谢!
瑞安·朗

7
问题是大多数人不想要数组,并且期望简单的key => value响应
bgcode 2013年

12

编辑:如评论中所述,如果有人想伤害您,则使用符号键可以使您的服务器瘫痪。在使用低配置的应用程序时,我仍然会做很多事情,因为它使操作变得更容易,但对于高风险的应用程序,我将不再做

不要忘记象征获得所需结果的键

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

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


8
象征用户提供的密钥是一个坏主意。符号不是GC,因此,如果有人使用大量伪造的参数密钥向服务器发送垃圾邮件,则它将在某些时候耗尽进程内存。
Julik 2012年

6
Ruby 2.2现在将提供GC符号。
莱斯莱

8

如果您谈论的是用于获取有关参数的数据的Urls,

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

然后获取查询参数。使用

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.