这只会改变path组件,而保留查询参数。
我的路由中有一个功能正常的重定向。Rb like so;
match "/invoices" => redirect("/dashboard")
我现在想要添加一个查询字符串,这样,例如,
/invoices?show=overdue
将被重定向到
/dashboard?show=overdue
我试过好几种方法。我得到的最接近的是;
match "/invoices?:string" => redirect("/dashboard?%{string}")
给我正确的输出,但原始的URL仍然显示在浏览器中。
我肯定我错过了一些很简单的东西,但是我看不出是什么。
在这种情况下可以使用请求对象:
match "/invoices" => redirect{ |p, request| "/dashboard?#{request.query_string}" }
最简单的方法(至少在Rails 4中)是使用重定向调用的选项模式。
get '/invoices' => redirect(path: '/dashboard')
虽然接受的答案工作完美,但它不太适合保持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 "/invoices", to: redirect(QueryRedirector.new("/dashboard"))
我已经写了一篇文章,有更详细的解释。