2009-04-15 25 views
7

Ho un URL della forma http://www.example.com?foo=one&foo=twocome analizzare campo multivalore da Query URL in Rails

voglio ottenere una matrice di valori ['one', 'two'] per foo, ma params[:foo] restituisce solo il primo valore.

So che se ho usato foo[] invece di foo nell'URL, quindi params[:foo] mi avrebbe dato la matrice desiderata.

Tuttavia, desidero evitare di modificare la struttura dell'URL, se possibile, poiché la sua forma è fornita come specifica per un'applicazione client. c'è un buon modo per ottenere tutti i valori senza cambiare il nome del parametro?

risposta

13

È possibile utilizzare il modulo predefinito CGI Ruby per analizzare la stringa di query in un controller Rails in questo modo:

params = CGI.parse(request.query_string) 

Questo vi darà quello che vuoi, ma nota che non sarà possibile ottenere qualsiasi Rails altre estensioni per interrogare l'analisi delle stringhe, ad esempio utilizzando HashWithIndifferentAccess, quindi ci sarà necessario utilizzare String piuttosto che le chiavi dei simboli.

Inoltre, non credo che sia possibile impostare parametri del genere con una singola riga e sovrascrivere il contenuto dei parametri delle guide predefinite. A seconda di quanto diffuso desideri questo cambiamento, potresti aver bisogno di eseguire il patch delle scimmie o un pò di hackerare gli interni. Tuttavia la cosa rapida se si voleva un cambiamento globale sarebbe quello di mettere questo in un prima filtro application.rb e utilizzare un nuovo var esempio, come @raw_params

+0

funziona come un fascino, grazie. Avevo solo bisogno di un solo posto in un controller, quindi non avevo nemmeno bisogno di scherzare con i parametri. – ykaganovich

2

mi piace la soluzione CGI.parse (request.query_string) citato in un'altra risposta. Si potrebbe fare questo per unire la stringa di query personalizzata analizzato in params:

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

La simbolizzazione automatica ti aprirà per un attacco DoS sulla tua applicazione. Ruby mai garbage raccoglie le istanze Symbol, quindi restano in memoria, senza fare nulla, fino a quando l'app non viene riavviata. –

+1

@ FrançoisBeausoleil - Avete un collegamento che spiega questo problema in modo più dettagliato? È ancora un problema in Ruby 1.9.2/Rails 3? –

+0

@MattHuggins - Vedere https://bugs.ruby-lang.org/issues/7791. E il problema dovrebbe essere risolto in 2.2. –

Problemi correlati