我的routes.rb中有一个正常运行的重定向,就像这样;
match "/invoices" => redirect("/dashboard")
我现在想要为此添加一个查询字符串,例如
/invoices?show=overdue
将被重定向到
/dashboard?show=overdue
我尝试过几件事。我最接近的是;
match "/invoices?:string" => redirect("/dashboard?%{string}")
它为我提供了正确的输出,但原始网址仍显示在浏览器中。
我确定我错过了一些非常简单的东西,但我看不清楚。
答案 0 :(得分:16)
在这种情况下,您可以使用请求对象:
match "/invoices" => redirect{ |p, request| "/dashboard?#{request.query_string}" }
答案 1 :(得分:9)
最简单的方法(至少在Rails 4中)是使用选项模式进行重定向调用..
get '/invoices' => redirect(path: '/dashboard')
这只会更改路径组件并保留查询参数。
答案 2 :(得分:0)
虽然可接受的答案非常有效,但它并不适合保持干燥状态–一旦您需要重定向多个路径,就会有很多重复的代码。
在这种情况下,自定义重定向器是一种很好的方法:
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"))
我有一封an article的书,上面有更详细的说明。