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

68 parsing ruby-on-rails query-string

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

"foo=bar&bar=foo&hello=hi"
Run Code Online (Sandbox Code Playgroud)

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

{
    :foo => "bar",
    :bar => "foo",
    :hello => "hi"
}
Run Code Online (Sandbox Code Playgroud)

或者我必须自己写吗?

编辑

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

Jul*_*lik 150

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

 Rack::Utils.parse_nested_query("a=2") #=> {"a" => "2"}
Run Code Online (Sandbox Code Playgroud)

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

您还可以Rack::Utils在课堂中加入速记.

  • 不需要包括:`Rack :: Utils.parse_nested_query("a = 2")` (2认同)

dom*_*esz 32

CGI::parse("foo=bar&bar=foo&hello=hi")
Run Code Online (Sandbox Code Playgroud)

给你

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}
Run Code Online (Sandbox Code Playgroud)

  • 问题是大多数人不想要数组并且期望一个简单的key => value response (7认同)
  • 这是我尝试过的唯一一个处理每个参数的多个实例的实现 - 谢谢! (2认同)

sys*_*tho 10

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

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

Rack::Utils.parse_nested_query("a=2&b=tralalala").deep_symbolize_keys
Run Code Online (Sandbox Code Playgroud)

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

  • 象征用户提供的密钥是个坏主意.符号不是GC,所以如果有人用很多伪造的参数键来摧毁你的服务器,它会在某些时候耗尽进程内存. (8认同)
  • Ruby 2.2现在将是GC符号. (5认同)

lok*_*008 8

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

> request.url
=> "http://localhost:3000/restaurants/lokesh-dhaba?data=some&more=thisIsMore"
Run Code Online (Sandbox Code Playgroud)

然后获取查询参数.使用

> request.query_parameters
=> {"data"=>"some", "more"=>"thisIsMore"}
Run Code Online (Sandbox Code Playgroud)