【问题标题】:Add a prefix to generated links, but not to incoming routes为生成的链接添加前缀,但不为传入路由添加前缀
【发布时间】:2017-06-09 01:47:16
【问题描述】:

我们的 Rails 4 应用程序需要可通过古老的门户访问。该门户通过为每个 URL 添加(从浏览器的角度)前缀来工作;在将请求转发到我的应用程序之前,门户会删除此前缀。

所以浏览器调用https://portal.company.com/portal/prefix/xyzzy/myapp/mymodel/new;门户做它的事情并请求https://myserver.company.com/myapp/mymodel/new(以某种不相关的方式传递剥离的前缀)。前缀是动态的,可以在请求之间更改。

问题是门户无法重写我的应用程序提供的 HTML 页面。也就是说,它没有放在前缀中。它期望应用程序要么只发出相对 URL,要么自己添加门户前缀。

所以:

  • 例如,常规 URL /myapp/mymodel/new 在直接访问应用程序时必须保持原样(对于某些不使用门户的用户)。
  • 当通过门户访问时,我们的应用程序仍然必须像往常一样理解/myapp/mymodel/new,但是当使用mymodel_new_pathlink_to @mymodelform_for @my_model 或任何其他神奇的URL 生成器时,它必须添加门户前缀.因此,应用程序发出的任何 URL 都必须类似于 /portal/prefix/xyzzy/myapp/mymodel/new,其中每个请求的字符串 /portal/prefix/xyzzy 由我们定义的某种方法给出(xyzzy 部分可以在请求之间更改)。

我怎样才能做到这一点?我的routes.rb 今天看起来像这样:

MyApp::application.routes.draw do
  scope ' /myapp' do
    get ...

这可能必须保持原样,因为传入请求中的 URL 在来自门户时不会更改。但是如何影响传出 URL?

【问题讨论】:

  • 如果请求来自门户,您可以编写简单的中间件将前缀附加到所有相对路径
  • @ArkadiuszOleksy,你的意思是它会像html.gsub!(/myurlroot/, "portalprefix/myurlroot那样做一些事情?是的,我有这个想法,它应该足够简单,但有点希望在不重写的情况下从根本上解决问题。如果没有其他问题,我会记住的。

标签: ruby routes portal


【解决方案1】:

此建议将允许您根据需要轻松地为 Rails 路径助手生成的 url 添加前缀。但是请注意,它也会使这些扩展路径成为您的应用程序的有效请求 - 它们应该只是路由到预期的位置,但您会在 params 哈希中获得一些您可以忽略的额外值,所以我怀疑这可能是可以接受。


首先,将所有前缀位作为可选参数添加到路由的基本范围:

scope '(:portal/)(:prefixA/)(:prefixB)/myapp' do
  # routes
end

请注意,这些可选参数不能包含 / 字符,除非它被路径助手转义,因此如果您在前缀中有几个级别(看起来您在问题中这样做),您将需要一个几个不同的参数,除了最后一个,后面都是斜线,如上所述。

完成后,您应该在您的ApplicationController 中定义default_url_options,它应该返回您在路由中需要的值的哈希值:

def default_url_options(_options={})
  {
    portal:  'portal',
    prefixA: 'whatevertheprefixis',
    prefixB: 'nextbitoftheprefix'
  }
end

应该这样做,路径助手(以及link_to @object 等)现在应该在每次使用它们时都包含这些值。

请注意,由于开头的portal 位也是一个可选参数,因此您可以简单地向default_url_options 添加额外的逻辑,并让它在您不希望这种前缀行为时返回一个空哈希。

【讨论】:

  • 这听起来很棒!我会尝试并回复你。额外的路线应该不是问题。除此之外:你是怎么知道的?这是在某处记录的吗?我当然看不到 default_url_options 的文档中的这种行为,我什至在 API 文档中也没有找到接近 url_fordefault_url_options...
  • 这是我在我们自己的软件中所做的(我们需要在大多数内部用户 URL 的开头注入一个 ID 号)。路线中的可选参数只是......路线中的可选参数,没什么特别的。但我不记得我是如何找到 default_url_options 的 - 这不是最近的 - 我怀疑我试图对路径助手进行一些丑陋的修补以使可选参数工作并偶然发现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多