Parsuj ciąg znaków tak, jakby był to querystring w Ruby on Rails

Mam taki ciąg:

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

Czy Ruby on Rails dostarcza metod do analizy tego, jak gdyby był to querystring, więc otrzymuję hash w ten sposób:

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

Czy sam muszę to napisać?

EDIT

Należy pamiętać, że powyższy ciąg nie jest prawdziwym zapytaniem z adresu URL, ale raczej ciągiem przechowywanym w pliku cookie z Facebook Connect.

Author: Julik, 2010-05-05

5 answers

Odpowiedź zależy od wersji Rails, której używasz. Jeśli używasz wersji 2.3 lub nowszej, użyj wbudowanego parsera Racka dla params

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

Jeśli jesteś na starszych szynach, możesz rzeczywiście użyć CGI::parse. Zauważ, że obsługa hashów i tablic różni się subtelnie między modułami, więc musisz sprawdzić, czy dane, które otrzymujesz, są poprawne dla wybranej metody.

Możesz również dołączyć Rack::Utils do swojej klasy, aby uzyskać dostęp do skrótu.

 143
Author: Julik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-05 17:14:43

The

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

Daje

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}
 30
Author: dombesz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-05 12:17:46

Edit: Jak wspomniano w komentarzach, klucze symolizujące mogą zniszczyć twój serwer, jeśli ktoś chce cię skrzywdzić. Wciąż robię to dużo, gdy pracuję nad aplikacjami o niskim profilu, ponieważ ułatwia to pracę, ale nie robiłbym tego już dla aplikacji o wysokim poziomie]}

Nie zapomnij symbolizować kluczy do uzyskania pożądanego wyniku

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

Ta operacja jest destrukcyjna dla duplikatów.

 8
Author: systho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-20 15:02:52

Jeśli mówisz o adresach URL, które są używane do uzyskania danych o parametrach

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

Następnie, aby uzyskać parametry zapytania. use

> request.query_parameters
=> {"data"=>"some", "more"=>"thisIsMore"}
 8
Author: lokeshjain2008,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-02 05:20:31

Jeśli chcesz hash możesz użyć

Hash[CGI::parse(x).map{|k,v| [k, v.first]}]
 0
Author: Arnold Roa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 12:12:52