为生成的链接添加前缀,但不为传入路由添加前缀

时间:2017-01-24 10:01:03

标签: ruby routes portal

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

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

问题是门户网站无法重写我的应用程序提供的HTML页面。也就是说,它没有放入前缀。它希望应用程序只发出相对URL,或者自己添加门户前缀。

所以:

  • 例如,常规网址/myapp/mymodel/new必须与直接访问应用程序时保持一致(对于不使用门户网站的某些用户)。
  • 通过门户网站访问时,我们的应用程序必须像往常一样了解/myapp/mymodel/new,但在使用mymodel_new_pathlink_to @mymodelform_for @my_model或其他任何魔术网址生成器时, ,它必须添加门户前缀。因此,应用程序发出的任何URL必须看起来像/portal/prefix/xyzzy/myapp/mymodel/new,其中每个请求字符串/portal/prefix/xyzzy由我们定义的某个方法给出(并且部分xyzzy可以在请求之间更改)。

我怎样才能实现这一目标?我的routes.rb今天看起来像这样:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

请注意,那些可选参数不能包含/字符而不会被路径助手转义,所以如果你在前缀中有几个级别(你在问题中看到它),那么你将会需要一些不同的参数,除了最后一个后跟斜线,如上所述。

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

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

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

请注意,由于start的portal位也是一个可选参数,因此您只需向default_url_options添加其他逻辑,并在不希望出现此前缀行为时返回空哈希。