簡體   English   中英

Rails路由重定向查詢字符串

[英]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.

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