2012-06-19 54 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 
相关问题