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.
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.
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"]}
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.
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"}
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]}]
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