Разобрать строку, как если бы это была строка запроса в Ruby on Rails - PullRequest
67 голосов
/ 05 мая 2010

У меня есть такая строка:

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

Предоставляет ли Ruby on Rails методы для анализа этого, как если бы это была строка запроса, поэтому я получаю хеш-код, подобный следующему:

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

Или мне самому написать?

EDIT

Обратите внимание, что приведенная выше строка не является реальной строкой запроса из URL, а скорее строкой, сохраненной в файле cookie из Facebook Connect.

Ответы [ 5 ]

148 голосов
/ 05 мая 2010

Ответ зависит от версии Rails, которую вы используете. Если вы используете 2.3 или более позднюю версию, используйте встроенный парсер Rack для параметров

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

Если вы используете более старые Rails, вы действительно можете использовать CGI::parse. Обратите внимание, что обработка хешей и массивов различается между модулями, поэтому вам нужно проверить, правильны ли получаемые данные для выбранного вами метода.

Вы также можете включить Rack::Utils в свой класс для краткого доступа.

32 голосов
/ 05 мая 2010

The

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

Дает вам

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}
8 голосов
/ 02 октября 2014

Если вы говорите об URL-адресах, которые используются для получения данных о параметрах их

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

Затем, чтобы получить параметры запроса. использовать

> request.query_parameters
=> {"data"=>"some", "more"=>"thisIsMore"}
8 голосов
/ 02 февраля 2012

Редактировать: , как сказано в комментариях, символизирующие ключи могут сломать ваш сервер, если кто-то захочет причинить вам вред. Я до сих пор много делаю, когда работаю с низкопрофильными приложениями, потому что с ними легче работать, но больше не буду делать это для приложений с высокими ставками

Не забудьте обозначить ключи для получения желаемого результата

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

эта операция разрушительна для дубликатов.

1 голос
/ 06 февраля 2018

Если вам нужен хеш, вы можете использовать

Hash[CGI::parse(x).map{|k,v| [k, v.first]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...