2009-04-15 18 views
7

Mam URL postaci http://www.example.com?foo=one&foo=twojak analizować wielowartościowego pola z kwerendy URL w Rails

Chcę uzyskać tablicę wartości ['one', 'two'] dla foo, ale params[:foo] zwraca tylko pierwszą wartość.

Wiem, że gdybym użył foo[] zamiast foo w adresie URL, to params[:foo] dałby mi pożądaną tablicę.

Jednak, jeśli to możliwe, chcę uniknąć zmiany struktury adresu URL, ponieważ jego formularz jest dostarczany jako specyfikacja aplikacji klienckiej. czy istnieje dobry sposób na uzyskanie wszystkich wartości bez zmiany nazwy parametru?

Odpowiedz

13

Można użyć domyślnego modułu Ruby CGI do analizowania ciąg kwerendy w kontroler Rails tak:

params = CGI.parse(request.query_string) 

To da Ci to, co chcesz, ale należy pamiętać, że nie dostaniesz żadnego z Rails inne rozszerzenia do analizy łańcuchów zapytań, takie jak użycie HashWithIndifferentAccess, więc będziesz musiał mieć do nas łańcuch zamiast kluczy symboli.

Ponadto, nie sądzę, aby można było ustawić takie parametry za pomocą pojedynczej linii i nadpisać domyślne ustawienia parametrów szyn. W zależności od tego, jak rozpowszechniona jest ta zmiana, może być konieczne poprawienie małpki lub zhakowanie wewnętrznych elementów. Jednak sprawny rzeczą jeśli chciałeś zmiany globalne byłoby umieścić to w przed filtrem w application.rb i użyć nowej instancji var jak @raw_params

+0

działa jak wdzięk, dzięki. Potrzebowałem go tylko w jednym miejscu w jednym kontrolerze, więc nie musiałem nawet marnować params. – ykaganovich

2

podoba mi się rozwiązanie CGI.parse (request.query_string) określone w innej odpowiedzi. Możesz to zrobić, aby połączyć sparsowany ciąg zapytania niestandardowego w parametry:

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

Automatyczne symbolizowanie otworzy się na atak DoS w twojej aplikacji. Ruby nigdy nie zbiera informacji o instancjach Symbolu, więc pozostają w pamięci, nic nie robiąc, dopóki aplikacja nie zostanie ponownie uruchomiona. –

+1

@ FrançoisBeausoleil - Czy masz link wyjaśniający ten problem bardziej szczegółowo? Czy nadal jest problemem w Ruby 1.9.2/Rails 3? –

+0

@MattHuggins - Zobacz https://bugs.ruby-lang.org/issues/7791. A problem powinien zostać rozwiązany w 2.2. –

Powiązane problemy