2009-04-15 3 views
7

tengo una URL de forma http://www.example.com?foo=one&foo=twocómo analizar varios valores de campo de consulta URL en Rails

Quiero conseguir una matriz de valores para ['one', 'two']foo, pero params[:foo] sólo devuelve el primer valor.

sé que si usara foo[] en lugar de foo en la URL, entonces params[:foo] me daría la matriz deseada.

Sin embargo, quiero evitar cambiar la estructura de la URL si es posible, ya que su formulario se proporciona como una especificación para una aplicación cliente. ¿Hay una buena manera de obtener todos los valores sin cambiar el nombre del parámetro?

Respuesta

13

Puede utilizar el módulo por defecto de Ruby CGI para analizar la cadena de consulta en un controlador de rieles de este modo:

params = CGI.parse(request.query_string) 

Esto le dará lo que quiere, pero tenga en cuenta que no se va a cualquiera de los carriles otras extensiones para consultar el análisis sintáctico de cadenas, como el uso de HashWithIndifferentAccess, por lo que nos tendrá que utilizar cadenas en lugar de teclas de símbolos.

Además, no creo que pueda establecer parámetros como ese con una sola línea y sobrescribir los contenidos de los parámetros de los carriles predeterminados. Dependiendo de lo extendido que desee este cambio, es posible que necesite un parche de mono o hackear un poco las partes internas. Sin embargo la cosa expedita si quería un cambio global sería poner esto en un antes filtro en application.rb y utilizar una nueva instancia var como @raw_params

+0

funciona como un encanto, gracias. Solo lo necesitaba en un solo lugar en un controlador, así que ni siquiera tuve que ensuciar con params. – ykaganovich

2

me gusta la solución CGI.parse (request.query_string) mencionado en otra respuesta. Puede hacer esto para combinar la cadena de consulta analizada personalizada en params:

params.merge!(CGI.parse(request.query_string).symbolize_keys) 
+8

Simbolizar automáticamente se abrirá para un ataque DoS en su aplicación. Ruby never garbage recolecta instancias de Symbol, por lo tanto permanecen en la memoria, sin hacer nada, hasta que la aplicación se reinicia. –

+1

@ FrançoisBeausoleil - ¿Tiene un enlace que explica este problema con más detalle? ¿Sigue siendo una preocupación en Ruby 1.9.2/Rails 3? –

+0

@MattHuggins - Ver https://bugs.ruby-lang.org/issues/7791. Y se supone que el problema se resuelve en 2.2. –

Cuestiones relacionadas