2009-04-15 35 views
7

我有形式http://www.example.com?foo=one&foo=two如何解析從URL查詢多值字段中的Rails

我想要得到的值的數組['one', 'two']foo的URL,但params[:foo]只返回第一個值。

我知道如果我在網址中使用foo[]而不是foo,那麼params[:foo]會給我所需的數組。

但是,如果可能的話,我想避免更改URL的結構,因爲它的形式是作爲spec提供給客戶端應用程序的。有沒有一種很好的方式來獲取所有的值而不改變參數名稱?

回答

13

你可以使用默認的Ruby的CGI模塊來解析查詢字符串在Rails控制器,像這樣:

params = CGI.parse(request.query_string) 

這會給你想要的東西,但請注意,你不會得到任何的Rails其他擴展來查詢字符串解析,比如使用HashWithIndifferentAccess,所以你將不得不使用字符串而不是符號鍵。

另外,我不相信你可以用一行設置params,並覆蓋默認的rails params內容。根據你想要這個改變的程度,你可能需要修補或者修改一些內部信息。然而,迅速的事情,如果你想要一個全球性的變化將是把這個過濾器之前application.rb並使用一個新的實例VAR像@raw_params

+0

作品像一個魅力,謝謝。我只需要在一個控制器中的一個地方使用它,所以我甚至不需要使用params。 – ykaganovich 2009-04-15 19:47:03

2

我喜歡的另一種回答中提到的CGI.parse(request.query_string)解決方案。你可以這樣做,以合併自定義解析的查詢字符串到參數:

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

自動符號化會打開自己的應用程序的DoS攻擊。 Ruby永遠不會垃圾收集符號實例,因此他們留在內存中,什麼都不做,直到應用程序重新啓動。 – 2010-03-09 16:15:22