Работа со строками запроса в Rails при наличии идентичных ключей - PullRequest
2 голосов
/ 08 февраля 2012

В настоящее время я работаю над реализацией стандарта Системы распределенных аннотаций для нашего проекта openSNP.org, однако я столкнулся с проблемой со строками запросов

Стандарт предписывает, как пользователь может получить доступ к несколькимобласти генома (или любого другого источника биологических данных), используя строку запроса / признаки? сегмент = 1: 1,999; сегмент = 2: 100,1000, где число перед двоеточием является хромосомой, а два других числа начинаютсяи конечные положения на хромосоме.

Неограниченный сегмент = X: разрешены строки a, b, чтобы пользователь мог просматривать разные позиции и хромосомы, используя только один запрос.

Проблема, с которой я столкнулся в Rails, заключается в том, чтоСтрока запроса не работает "из коробки" с массивом params - в конце концов, у меня всегда один и тот же ключ, а последний ключ всегда перезаписывает предыдущий, так что в итоге у меня есть только "сегмент"=> «2: 100,1000» в моем массиве params, «сегмент» => «1: 1,999» перезаписывается.

Я думал об использовании JavaScript для изменения строки запроса перед ее передачей вконтроллер, но используемое представление является базовым XML, и реализация JavaScript в этой ситуации кажется излишней.Есть ли способ получить доступ к строке запроса в Rails до создания массива params, чтобы я мог просто заменить все «сегменты» на некоторый счетчик или просто выкинуть все «сегменты» и сохранить координаты?

1 Ответ

4 голосов
/ 08 февраля 2012

Rails использует Rack::Utils.parse_nested_query, который обрабатывает строки запроса так, как вы видели:

>> Rack::Utils.parse_nested_query "segment=1:1,999;segment=2:100,1000"
=> {"segment"=>"2:100,1000"} 

Однако вы можете получить необработанную строку запроса из объекта запроса Rails, используя request.query_string, а затемиспользуйте CGI.parse, который обрабатывает вещи больше, чем вы:

>> CGI.parse "segment=1:1,999;segment=2:100,1000"
=> {"segment"=>["1:1,999", "2:100,1000"]} 
...