ruby on rails 3 -如何在路由中进行重定向.传递查询字符串



我的路由中有一个功能正常的重定向。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')
这只会改变path组件,而保留查询参数。

虽然接受的答案工作完美,但它不太适合保持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"))

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

相关内容

  • 没有找到相关文章

最新更新