2012-06-19 55 views
7

我有一個搜索表單,其中有很多選項,已提交給Get請求的路由。 URL是這樣的:如何從查詢字符串中刪除空白值params

http://localhost:3000/restaurants/search?utf8=%E2%9C%93&city=&cuisine=&number_of_people=&query=hello 

很多params。我想讓它變得更清潔,就像刪除所有空白的參數一樣。

是這樣的:(基本上去除所有這些都是空白的PARAMS)

http://localhost:3000/restaurants/search?query=hello 

如何做到這一點?

一種方法可以使用

CGI::parse("foo=bar&bar=foo&hello=hi") 

給你

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]} 

首先將用戶重定向在行動之間和在行動支票PARAMS是空白的,並刪除它們之間,然後最終將他重新定向到搜索的實際行動上。但這聽起來很蹩腳。我怎樣才能以更好的方式做到這一點?

+0

爲什麼是空值的問題? –

+0

@SergioTulentsev爲了使網站更乾淨.. –

+0

@SergioTulentsev它的搜索表單。一旦用戶提交表格。都出現了。 –

回答

1

只是純醇」紅寶石......

require 'uri' 
a = "http://localhost:8080/path/search?foo=&bar=&baz=2&bat=thing" 
u = URI.parse(a) 
params = u.query.split("&").select {|param| param =~ /=./}.join("&") 
# Returns "baz=2&bat=thing" 
+0

不適用於此:http:// localhost:3000/restaurants/search?utf8 =%E2%9C%93&city =&cuisine =&number_of_people =&booking%5Bdate_of_booking%5D = 19 + June + 2012&booking%5Btime_of_booking%281i%29%5D =&預訂%5Btime_of_booking%282I%29%5D =&預訂%5Btime_of_booking%283i%29%5D =&預訂%5Btime_of_booking%284I%29%5D =&預訂%5Btime_of_booking%285i%29%5D =&預訂%5Btime_of_booking%287i%29%5D = -2&query =&commit =提交 –

+0

它在這裏工作正常。 –

+1

我做了'params.select!{| k,v | v.present?}'得到相同的結果,但我不知道如何使響應URL被清除。 – juanpastas

0

我建議,如果只盯着普通的老紅寶石,一個簡單的GSUB可能就足夠了:

url.gsub(/[^\?&=]+=(?:&|$)/, '') 

注意:這可能離開末&符號,其可與

url.chomp('&') 
2

我的解決辦法被修整爲禁用空白輸入和塞萊CTS:

$('form').submit (e) -> 
    $(@).find('select,input').map((i, e) -> e.disabled = !$(e).val()) 

關於拆除utf8我發現this。所以我最好繼續發送它。

在使用redirect_to時,在服務器上執行所有這些操作會導致額外的請求,所以我更願意使用客戶端代碼。

1

在你的控制器的方法,調用remove_empty_query_params

然後作爲一個私有方法:

def remove_empty_query_params 
    # Rewrites /projects?q=&status=failing to /projects?status=failing 
    require 'addressable/uri' 
    original = request.original_url 
    parsed = Addressable::URI.parse(original) 
    return unless parsed.query_values.present? 
    queries_with_values = parsed.query_values.reject { |_k, v| v.blank? } 
    if queries_with_values.blank? 
     parsed.omit!(:query) 
    else parsed.query_values = queries_with_values 
    end 
    redirect_to parsed.to_s unless parsed.to_s == original 
    end 
相關問題