[英]Rails - redirect to current url without one of the GET params
我在 Rails 應用程序中有一個非常簡單的問題,我找不到一個優雅的解決方案。
我有一個 URL,例如: http://www.example.com/some-path/?foo=123&baz=456
我想處理其中一個參數並重定向到: http://www.example.com/some-path/?baz=456
我希望這通常適用於任何帶有參數“foo”的 URL,所以我不想在重寫代碼中指定“baz”。
我想要的是這樣的:
redirect_to request.path, :params => request.query_parameters.except(:foo)
除非那不太奏效。 我知道我可以手動正則表達式或解析查詢字符串,但我認為有更好的方法。
到目前為止,我發現的最好的方法是使用:
url_for(params.except(:obsolete_param_name))
UPDATE
正如格羅瑟所提到的,這會在您的應用程序中打開一個安全漏洞,因為攻擊者可以將主機作為URL參數傳遞,並將用戶重定向到其他網站。 為了防止這種情況,您可以使用rap1ds的建議並指定只需要使用路徑。
為此,您可以使用類似這樣的輔助函數:
def secure_path_for(params, *excluded_params)
url_for(params.except(*excluded_params).merge(only_path: true))
end
如何在傳遞它之前刪除params [:foo]。 也許是這樣的:
params.delete[:foo]
redirect_to request.path, :params => params
它不是很優雅,但它只增加了一行。 順便說一句,Params是一個幫助方法,它獲取url的當前參數
在rails 5中,如果您嘗試執行此操作,您將獲得非清理請求參數錯誤url_for(params.except(:param))
所以我發現這樣做:
request_url = request.url # eg. http://qwe.com/path?param1=1¶m2=2
query_hash = Rack::Utils.parse_query(URI.parse(request_url).query).except('param1')
url = query_hash.empty? ? request.path : "#{request.path}?#{query_hash.to_query}"
puts url #=> /path?my_param2=2
redirect_to url
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方式”,如果有這樣的方法,就可以解決這個問題。 例如:
?x[a]=1&y[]=2
變為{"x"=>{"a"=>"1"}, "y"=>["2"]}
依此類推,因此使用提供的查詢字符串和參數例程的代碼在這方面很難處理。 因此,通過原始字符串值過濾參數可能很困難。 即使非rails / rack CGI模塊也會為param值提供數組而不是字符串。 params
hash包括GET,POST和路由參數,例如:action
和:controller
所以你不能再重復使用它來重建一個查詢字符串。 鑒於這些問題,我發現我無法使用提供的框架功能來獲得純粹的,不受干擾的查詢字符串,從當前請求中按原樣再現,只是刪除一個參數。 但是,上面的代碼似乎運行良好。
萬一以后有人來,這對我有用
link_to request.params.except(:param)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.