簡體   English   中英

Rails - 在沒有 GET 參數之一的情況下重定向到當前 url

[英]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&param2=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方式”,如果有這樣的方法,就可以解決這個問題。 例如:

  • Rails參數解析將自動實例化使用特殊方括號語法的查詢參數的數組和散列: ?x[a]=1&y[]=2變為{"x"=>{"a"=>"1"}, "y"=>["2"]}依此類推,因此使用提供的查詢字符串和參數例程的代碼在這方面很難處理。 因此,通過原始字符串值過濾參數可能很困難。 即使非rails / rack CGI模塊也會為param值提供數組而不是字符串。
  • rails params hash包括GET,POST和路由參數,例如:action:controller所以你不能再重復使用它來重建一個查詢字符串。
  • 因此,像url_for這樣的URL幫助程序沒有多大幫助。

鑒於這些問題,我發現我無法使用提供的框架功能來獲得純粹的,不受干擾的查詢字符串,從當前請求中按原樣再現,只是刪除一個參數。 但是,上面的代碼似乎運行良好。

萬一以后有人來,這對我有用

link_to request.params.except(:param)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM