2017-01-24 77 views
1

我們的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從門戶何時到來不會改變。但是,我如何影響傳出的網址?

+0

如果請求來自門戶 –

+0

@ArkadiuszOleksy,您可以編寫簡單的中間件來將前綴追加到所有相對路徑,您的意思是它會沿着'html.gsub!(/ myurlroot /,「portalprefix/myurlroot 「是的,我有這個想法,它應該很簡單,但是希望能夠解決問題的根源而不需要重寫。如果沒有其他問題出現,我會記住這一點。 – AnoE

回答

0

這個建議可以讓你輕鬆地爲Rails路徑助手所生成的網址加上前綴。但是,請注意,它也會使這些擴展路徑對您的應用程序提出有效的請求 - 它們應該在預期的位置路由,但在params哈希中您可以忽略一些額外的值,所以我懷疑這可能是可以接受的。


首先,所有的前綴位作爲可選參數添加到您的路線基地範圍:

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

注意,這些可選PARAMS不能包括/字符而不會被路徑傭工逃脫,所以如果你在前綴中有幾個級別(你在問題中出現了這個級別),你需要一些不同的參數,除了最後一個後面跟着一個斜槓,就像上面一樣。

做完這些後,你應該在你的ApplicationController定義default_url_options,它應該返回的值的散列你在你的路線需要:

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

而且應該這樣做,路徑傭工(與link_to @object等一起)現在應該每次都使用這些值。

請注意,由於portal位在開始時也是一個可選參數,因此您可以簡單地將其他邏輯添加到default_url_options,並在不需要此前綴行爲時讓它返回一個空的散列值。

+0

這聽起來不錯很好,我會嘗試一下,然後回覆你,其他路線不應該是一個問題,不管怎麼說,你是怎麼知道這個的?這是否記錄在某個地方?我當然不能在' default_url_options',我甚至在API文檔中甚至找不到'url_for'附近提到的'default_url_options ...' – AnoE

+0

這是我在我們自己的軟件中做的事情(我們需要一個ID號碼注入大多數URL的內部用戶的開始)。在路線中的可選參數只是...可選參數在路線中,沒有什麼特別的。但我不記得我是如何找到'default_url_options' - 這不是最近 - 我懷疑我試圖做一些醜陋的路徑助手修補,使可選參數工作,並偶然發現。 – DMA57361