16

我的 routes.rb 中有一个正常的重定向,就像这样;

match "/invoices" => redirect("/dashboard")

我现在想为此添加一个查询字符串,例如,

/invoices?show=overdue

将被重定向到

/dashboard?show=overdue

我已经尝试了几件事。我得到的最接近的是;

match "/invoices?:string" => redirect("/dashboard?%{string}")

这给了我正确的输出,但原始 URL 仍显示在浏览器中。

我确定我错过了一些非常简单的东西,但我看不出是什么。

4

3 回答 3

16

在这种情况下,您可以使用请求对象:

match "/invoices" => redirect{ |p, request| "/dashboard?#{request.query_string}" }
于 2012-12-26T11:27:01.543 回答
11

最简单的方法(至少在 Rails 4 中)是使用选项模式进行重定向调用..

get '/invoices' => redirect(path: '/dashboard')

这只会更改路径组件并单独保留查询参数。

于 2016-06-23T00:39:26.890 回答
0

虽然接受的答案非常有效,但它不太适合保持 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"))

我写了一篇文章,有更详细的解释。

于 2019-03-01T10:02:14.463 回答