Как разобрать многозначное поле из URL-запроса в Rails - PullRequest
7 голосов
/ 15 апреля 2009

У меня есть URL формы http://www.example.com?foo=one&foo=two

Я хочу получить массив значений ['one', 'two'] для foo, но params[:foo] возвращает только первое значение.

Я знаю, что если бы я использовал foo[] вместо foo в URL, то params[:foo] дал бы мне нужный массив.

Однако я хочу по возможности избежать изменения структуры URL, поскольку его форма предоставляется в виде спецификации для клиентского приложения. Есть ли хороший способ получить все значения без изменения имени параметра?

Ответы [ 2 ]

13 голосов
/ 15 апреля 2009

Вы можете использовать модуль Ruby CGI по умолчанию для анализа строки запроса в контроллере Rails следующим образом:

params = CGI.parse(request.query_string)

Это даст вам то, что вы хотите, но учтите, что вы не получите никаких других расширений Rails для разбора строки запроса, например, с использованием HashWithIndifferentAccess, поэтому вам придется использовать String, а не Symbol ключи. *

Кроме того, я не верю, что вы можете установить такие параметры одной строкой и перезаписать содержимое параметров rails по умолчанию. В зависимости от того, насколько широко вы хотите это изменение, вам может понадобиться немного подправить патч или взломать внутренности. Однако, если вам нужно глобальное изменение, то целесообразно поместить его в фильтр before в application.rb и использовать новый экземпляр var, такой как @raw_params

2 голосов
/ 15 апреля 2009

Мне нравится решение CGI.parse (request.query_string), упомянутое в другом ответе. Вы можете сделать это, чтобы объединить пользовательскую строку запроса в параметры:

params.merge!(CGI.parse(request.query_string).symbolize_keys)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...