【问题标题】:How to remove blank values params from query string如何从查询字符串中删除空白值参数
【发布时间】:2012-06-21 13:49:01
【问题描述】:

我有一个搜索表单,有很多选项,提交到带有 Get 请求的路线。网址是这样的:

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"]}

首先在中间操作和中间操作中重定向用户,检查哪些参数为空白并删除它们,然后最终将他重定向到实际的搜索操作。但这听起来很蹩脚的事情。我怎样才能以更好的方式做到这一点?

【问题讨论】:

  • 为什么空白值是问题?
  • @SergioTulentsev 让网址更干净..
  • @SergioTulentsev 它是一个搜索表单。一旦用户提交表单。一切都来了。
  • 你可以像query.gsub(/\w+=&/, '')那样做。
  • 我想对 Sergio 的 cmets 投反对票。

标签: ruby-on-rails ruby query-string querystringparameter


【解决方案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

【讨论】:

    【解决方案2】:

    我的解决方案是禁用空白输入并选择:

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

    关于删除utf8 我找到了this。所以我最好继续发送它。

    在使用 redirect_to 时,在服务器上执行所有这些操作会导致额外的请求,因此我更喜欢使用客户端代码。

    【讨论】:

      【解决方案3】:

      我建议,如果只看普通的旧 ruby​​,一个简单的 gsub 可能就足够了:

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

      注意:这可能会在末尾留下一个&符号,可以用

      url.chomp('&')
      

      【讨论】:

        【解决方案4】:

        只是用普通的红宝石......

        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" 
        

        【讨论】:

        • 不适用于此:localhost:3000/restaurants/…
        • 我做了params.select!{|k, v| v.present?} 得到相同的结果,但我不知道如何使响应 URL 被清理。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 2013-02-08
        相关资源
        最近更新 更多