如何在routes.rb中进行重定向传递查询字符串

时间:2012-12-26 10:21:35

标签: ruby-on-rails-3 redirect routes

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

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

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

/invoices?show=overdue

将被重定向到

/dashboard?show=overdue

我尝试过几件事。我最接近的是;

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

它为我提供了正确的输出,但原始网址仍显示在浏览器中。

我确定我错过了一些非常简单的东西,但我看不清楚。

3 个答案:

答案 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的书,上面有更详细的说明。