Проаналізуйте рядок так, ніби це рядок запиту в Ruby on Rails


78

У мене є такий рядок:

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

Чи надає Ruby on Rails методи аналізу цього, ніби це рядок запиту, тому я отримую такий хеш:

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

Або я повинен написати це сам?

РЕДАГУВАТИ

Зверніть увагу, що наведений вище рядок - це не справжній рядок запиту з URL-адреси, а радше рядок, що зберігається у файлі cookie від Facebook Connect.

Відповіді:


163

Відповідь залежить від версії Rails, яку ви використовуєте. Якщо ви використовуєте 2.3 або пізнішу версію, використовуйте вбудований синтаксичний аналізатор Rack для параметрів

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

Якщо ви перебуваєте на старих рейках, ви дійсно можете ними скористатися CGI::parse . Зауважте, що обробка хешів та масивів різниться між модулями, тож вам потрібно перевірити, чи правильно отримуються дані для вибраного вами методу.

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


Якщо ви хочете отримати об’єкт params, який надає вам rails, ви можете зробити це: params = ActionController :: Parameters.new (Rack :: Utils.parse_nested_query ("a = 2"))
adailey

Хтось знає, чи можна уникнути того, щоб значення параметрів рядка запиту передавались у рядки? наприклад, я хочу таку поведінку: `` Rack :: Utils.raw_parse_nested_query ("a = 2") # => {"a" => 2} ``
mecampbellsoup

1
Хоча це приємно більшу частину часу: він аналізує "a[]=&a[]=z"як {"a[]"=>["", "z"]}, коли будь-який парсер, який насправді використовується, ActionController::Baseповертається{:a => ["z"]}
Джеремі

37

The

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

Дає вам

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

2
Це єдина реалізація, яку я пробував, яка обробляє кілька екземплярів кожного параметра - Дякую!
Райан Лонг,

7
Проблема в тому, що більшість людей не хочуть масивів і очікують простого ключа => значення відповіді
bgcode

12

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

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

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

ця операція руйнує дублікати.


8
Символізація наданих користувачем ключів - погана ідея. Символи не відповідають, тому якщо хтось спамує ваш сервер великою кількістю неправдивих ключів параметрів, це в якийсь момент вичерпає пам’ять процесу.
Джулік

6
Ruby 2.2 тепер буде символами GC.
Лесле

8

Якщо ви говорите про URL-адреси, які використовуються для отримання даних про їх параметри

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

Потім отримати параметри запиту. використання

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.