【问题标题】:How do I do a redirection in routes.rb passing on the query string如何在传递查询字符串的 routes.rb 中进行重定向
【发布时间】:2012-12-11 22:17:11
【问题描述】:

我的 routes.rb 中有一个正常的重定向功能;

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

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

/invoices?show=overdue

将被重定向到

/dashboard?show=overdue

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    我有一个书面的an article 有更详细的解释。

    【讨论】:

      【解决方案2】:

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

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

      这只会改变路径组件,不理会查询参数。

      【讨论】:

      • 谢谢!!!浏览了大约 6 篇不同的 SO 帖子,然后我才发现这篇最近的简单帖子解决了我所有的问题。
      • 请注意,这不会转发从 url 中的路径中提取的参数,例如 invoices/:id
      • @the_minted 实际上你可以简单地使用 %{id}。例如get '/invoices/:id' => redirect(path: '/new_invoices/%{id}')
      【解决方案3】:

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

      match "/invoices" => redirect{ |p, request| "/dashboard?#{request.query_string}" }
      

      【讨论】:

      • 感谢回答者。另请注意,此代码在 SEO 方面不好,因为如果 query_string 为空,则 url 看起来像“...?”
      • 在这种情况下match "/invoices" => redirect{ |p, request| request.query_string.blank? ? "/dashboard" : "/dashboard?#{request.query_string}" } 应该这样做......
      猜你喜欢
      • 2012-05-21
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2012-07-03
      • 2019-11-18
      • 2010-11-23
      相关资源
      最近更新 更多