Разбор строки, как если бы это была строка запроса в Ruby on Rails


у меня есть строка вроде этой:

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

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

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

или я должен написать его сам?

EDIT

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

5 60

5 ответов:

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

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

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

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

The

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

дает

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

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

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

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

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

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

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

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

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

Если вы хотите, чтобы хэш, вы можете использовать

Hash[CGI::parse(x).map{|k,v| [k, v.first]}]