[英]Rails routes redirect for query string
我有一個問題,最近改變了控制器的名稱。
對於具有引用舊名稱的書簽的人,我將路由文件更改為接受使用舊控制器名稱的呼叫:
get '/old/about', to: redirect('/new/about')
get '/old/report/:client', to: redirect('/new/report/%{client}')
get '/old/:sub_path', to: redirect('/new/%{sub_path}')
工作正常。 但對於帶有查詢字符串的調用,它會將其阻止為/ report / 200。 例如:
/舊/報告/ 200?C_ID = 257&端= 2013年10月19日&NUM_RESULTS = 294540&開始= 2013年10月13日
它將網址切換為:
老/報告/ 200
並且由於缺少參數而向我顯示錯誤。 你知道我能做什么嗎? (我認為:路線中的sub_path行會有所幫助但不是):(
修改redirect
以使用path:
選項保留查詢字符串:
- get '/old/about', to: redirect('/new/about')
+ get '/old/about', to: redirect(path: '/new/about')
這在用於redirect
的API文檔中進行了演示,請參閱http://api.rubyonrails.org/classes/ActionDispatch/Routing/Redirection.html#method-i-redirect
Matt提到的問題幫助我弄清楚了答案(非常感謝!)。 這與我的具體案例略有不同。 我留下的答案對我有用,以備將來參考。
match "/old/report/:client" => redirect{ |params, request| "/new/report/#{params[:client]}?#{request.query_string}" }
以亞歷杭德拉的答案為基礎,更加冗長但沒有?
如果沒有查詢字符串:
get "/old/report/:client", to: redirect{ |params, request| ["/new/report/#{params[:client]}", request.query_string.presence].compact.join('?') }
所以/old/report/:client?with=param
將成為/new/report/:client?with=param
, /old/report/:client
將成為/new/report/:client
。
現有的答案工作得很好,但不太適合保持DRY - 一旦你需要重定向多個路由,就會有很多重復的代碼。
在這種情況下,自定義重定向器是一種優雅的方法:
class QueryRedirector
def call(params, request)
uri = URI.parse(request.original_url)
if uri.query
"#{@destination}?#{uri.query}"
else
@destination
end
end
def initialize(destination)
@destination = destination
end
end
現在,您可以使用此類的新實例提供redirect
方法:
get "/old/report/:client", to: redirect(QueryRedirector.new("/new/report/#{params[:client]}"))
我有一篇文章,附有更詳細的解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.