【问题标题】:Rails' routes: how to pass "all" request params in a redirectRails 的路线:如何在重定向中传递“所有”请求参数
【发布时间】:2013-06-01 08:16:10
【问题描述】:

我想重定向所有根请求/pages/home url,但我想保留原始请求中使用的所有参数。

所以:

http://myserver.com/?param1=value1&param2=value2

变成

http://myserver.com/pages/home?param1=value1&param2=value2

有几个关于在 redirect 中传递参数的 SO 问题,但我没有发现任何与传递请求的参数相关的问题。

【问题讨论】:

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


    【解决方案1】:
    # routes.rb
    root :to => redirect { |params, request| "/pages/home?#{request.params.to_query}" }
    

    更新 1

    您还可以使用request.params 来构建新的path

    root :to => redirect { |params, request| "/pages/#{request.params[:page]}.html?#{request.params.to_query}" }
    

    【讨论】:

    • 我正在发布我自己的解决方案,因为当我尝试在 SO 中找到解决方案时,我没有找到它。所以我希望它对下一个有同样疑问的人有所帮助
    • 另一个不考虑格式/内容类型的重定向附录(在 Rails 3.2.2 中):match '/*page', to: redirect {|params,request| "/pages/#{params[:page]}.#{request.format.to_sym.to_s}?#{request.params.to_query}"}
    • 悬空问号可处理:root :to => redirect { |_, request| ["/pages/#{request.params[:page]}.html", request.params.to_query].reject(&:blank?).join("?") }
    • 经过调查,我注意到这实际上是不必要的(至少从 Rails 4.1 开始),在我看来,如果您不传递任何参数,redirect() 本身就是这样做的. (如果您确实向它传递了一个包含 ? 的 URL,在我看来,它更喜欢那些而不是请求中的那些)。这使得这里的原始答案不太有效,因为它是不需要的代码。 “更新 1”中显示的内容确实允许您按照说明调整重定向路径。
    • 同样在 Rails4 上,这个功能似乎不起作用(这种方式包含在重定向规则中的参数)
    【解决方案2】:

    另一个答案有效,但在最后留下?,以防没有参数。

    这似乎没有副作用:

    root to: redirect(path: '/quick_searches/new')
    

    希望对你有帮助!

    【讨论】:

    • 使用此解决方案的唯一缺点 是您无法使用request 来构建新的path,正如我在更新中展示的那样1 我的回答。
    • 虽然@fguillen 对此是正确的,但这实际上是更准确的答案,因为原始问题仅询问在重定向发生时传递参数(如 UTM)。它没有询问基于这些参数的动态目的地(如果它在“更新 1”中有@fguillen 的答案会更准确)。事实上,这个答案揭示了问题的缺陷,即至少在 Rails 4.1(我测试过)中,这是自动的。
    【解决方案3】:

    在 Rails 5 中,这可以通过仅重写重定向中的路径组件来简洁地完成(因此将保留所有原始查询参数):

    # in routes.rb
    root to: redirect(path: '/pages/home')
    

    相关文档链接:

    http://api.rubyonrails.org/classes/ActionDispatch/Routing/Redirection.html

    【讨论】:

    • 似乎在 Rails 4 中。
    【解决方案4】:

    以@fguillen 对 Rails4 的回答为基础

    你需要在 routes.rb 中有两行

    # in routes.rb
    match "/pages/home", to: 'pages#index', via: :get    
    match "/", to: redirect{ |params, request| [ "/pages/home", request.env["rack.request.query_string"] ].join("?") }, via: :all
    

    如果没有参数,数组上的连接也会处理末尾的悬空问号。

    【讨论】:

    • 我没有在 4.1 之前测试过 Rails,但从 Rails 4.1 开始,这种行为是自动的。
    猜你喜欢
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多