uri = URI.parse(request.url)
new_query = uri.query.split("&").reject{|pair|
k,v = pair.split("=")
k =~ /^foo\[?/ # reject params named "foo" or "foo[anything"
}.join("&")
# if the new querystring is empty, assign nil instead of "" so we don't
# end up with a solitary question mark at the end of the url.
uri.query = (new_query.empty? ? nil : new_query)
redirect_to uri.to_s
この問題を解決するために、「Rails の方法」で物事を行おうとすると、いくつかの明白ではない問題に遭遇した後、上記の解決策にたどり着きました。例えば:
- Rails パラメーターの解析では、特別な角かっこの構文を使用するクエリ パラメーターの配列とハッシュが自動的にインスタンス化され
?x[a]=1&y[]=2
ます{"x"=>{"a"=>"1"}, "y"=>["2"]}
。結果として、生の文字列値によるパラメータのフィルタリングは困難になる可能性があります。Rails/rack 以外の CGI モジュールでさえ、param 値の文字列ではなく配列を提供します。
- Rails
params
ハッシュには、GET、POST、および and などのルーティング パラメータの両方が含まれ:action
て:controller
いるため、それを再利用してクエリ文字列を再構築することはできません。
- そのため、url_for のような URL ヘルパーはあまり役に立ちません。
これらの問題を考えると、提供されたフレームワーク機能を使用して、現在のリクエストからそのまま再現された純粋で無害なクエリ文字列を取得することができず、単純に 1 つのパラメーターのみを削除することがわかりました。ただし、上記のコードはうまく機能するようです。