我有一个搜索表单,有很多选项,提交到带有Get请求的路由。 URL是这样的:
http://localhost:3000/restaurants/search?utf8=%E2%9C%93&city=&cuisine=&number_of_people=&query=hello
有更多的参数。我想让它更清洁,比如删除所有空白的参数。
这样的事情:(基本上删除所有空白的参数)
http://localhost:3000/restaurants/search?query=hello
怎么做?
一种方法可以使用
CGI::parse("foo=bar&bar=foo&hello=hi")
给你
{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}
首先在用户之间重定向用户,并在操作之间检查哪些参数为空并删除它们,然后最终将其重定向到实际的搜索操作。但这听起来很蹩脚。我怎样才能以更好的方式做到这一点?
答案 0 :(得分:2)
我的解决方案是禁用空白输入并选择:
$('form').submit (e) ->
$(@).find('select,input').map( (i, e) -> e.disabled = !$(e).val() )
关于删除utf8
,我找到了this。所以我最好继续发送它。
在使用redirect_to时,在服务器上执行所有这些操作会产生额外的请求,所以我更喜欢使用客户端代码。
答案 1 :(得分: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"
答案 2 :(得分: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
答案 3 :(得分:0)
我建议,如果只看普通的旧红宝石,一个简单的gsub就足够了:
url.gsub(/[^\?&=]+=(?:&|$)/, '')
注意:这可能会在最后留下一个&符号,可以用
进行修剪url.chomp('&')