我们的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_path
或link_to @mymodel
或form_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?
答案 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
添加其他逻辑,并在不希望出现此前缀行为时返回空哈希。