9

たくさんのオプションがある検索フォームがあり、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

これを行う方法?

1つの方法は使用することができます

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

あなたにあげる

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

最初にユーザーをアクション間でリダイレクトし、アクション間でユーザーをリダイレクトして、どのパラメーターが空白であるかを確認してから削除し、最後に検索の実際のアクションでユーザーをリダイレクトします。しかし、これは非常につまらないことのように聞こえます。どうすればこれをより良い方法で行うことができますか?

4

4 に答える 4

3

コントローラーメソッドで、呼び出します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
于 2016-05-05T03:09:42.773 に答える
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" 
于 2012-06-19T14:00:35.723 に答える
0

普通の古いルビーを見るだけなら、単純な gsub で十分かもしれません。

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

注:これにより、最後にアンパサンドが残る場合があります。これは、

url.chomp('&')
于 2012-06-19T16:11:39.293 に答える