2017-01-24 4 views
1

Google 레일 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_path 또는 link_to @mymodel 또는 form_for @my_model을 사용하거나 다른 마술 URL 생성기가있는 경우에는 포털 접두어를 추가해야합니다. 따라서 응용 프로그램에서 생성 한 모든 URL은 /portal/prefix/xyzzy/myapp/mymodel/new처럼 표시되어야하며 요청 당 문자열 /portal/prefix/xyzzy은 Google에서 정의한 일부 방법으로 제공되며 (xyzzy은 요청간에 변경 가능)

어떻게하면됩니까? 이 오늘처럼 내 routes.rb 외모 :

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

이 아마 포털에서 오는 경우 들어오는 요청에서 URL이 변경되지 않기 때문에 그대로 유지한다. 그러나 나가는 URL에 어떻게 영향을 줍니까?

+0

요청이 포털 –

+0

@ArkadiuszOleksy에서 온 경우 모든 상대 경로에 접두어를 추가하는 간단한 미들웨어를 작성할 수 있습니다. 즉, 'html.gsub! (/ myurlroot /, "portalprefix/myurlroot '예, 그런 생각이 들었습니다. 충분히 간단해야하지만, 그런 재 작성없이 문제의 근원에서 문제를 해결하기를 바랬습니다. 다른 것이 나오지 않으면 계속 명심하십시오. – AnoE

답변

0

이 제안을 통해 Rails 경로 도우미가 생성 한 URL에 필요에 따라 쉽게 추가 할 수 있습니다. 그러나 이러한 확장 된 경로가 응용 프로그램에 대한 유효한 요청이 될 것이라는 점에주의하십시오. 예상 한대로 경로를 지정하지만 무시할 수있는 값인 params 해시에 추가 값을 얻을 수 있으므로 허용 가능할 것으로 판단됩니다.


먼저, 루트 '기본 범위를 선택적 매개 변수로 모든 접두사의 비트를 추가

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

주를 그 옵션 PARAMS는이 경로 도우미로 이스케이프되지 않고 / 문자를 포함 할 수 없음 , 만약 여러분이 접두어에 몇 개의 레벨을 가지고 있다면 (질문에서 나타나는 것처럼 보임) 위와 같이 약간의 다른 매개 변수가 필요합니다. 그 일을 통해

, 당신은 당신이 당신의 경로에 필요한 값의 해시 반환해야합니다, 당신의 ApplicationControllerdefault_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'을 어떻게 찾았는지 기억하지 못합니다 - 최근이 아니 었습니다 - 저는 옵션 헬기를 추악한 패칭을하여 선택적인 param 작업을하고 그것을 우연히 만났을 것으로 생각합니다. – DMA57361