2017-01-24 21 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_path или link_to @mymodel или form_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?

+0

вы можете написать простые промежуточное программное обеспечение, добавляемый префикс для всех относительных путей, если запрос пришел от портала –

+0

@ArkadiuszOleksy, вы имеете в виду, что бы сделать что-то вдоль линий 'html.gsub! (/ Myurlroot /«portalprefix/myurlroot «Да, у меня была эта идея, она должна быть достаточно простой, но вроде бы надеялась решить проблему в корне проблемы без такой перезаписи. Я буду иметь в виду, если ничего не придумает. – AnoE

ответ

0

Это предложение позволит вам легко префикс URL-адресов, созданных помощниками пути Rails, в соответствии с вашими требованиями. Однако обратите внимание, что это также сделает эти расширенные пути действительными запросами для вашего приложения - они будут просто маршрутизироваться туда, где это ожидалось, но вы получите дополнительные значения в хэш-файле 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 и т.д.) должны теперь включать эти значения каждый раз, когда вы их используете.

Обратите внимание, что поскольку бит portal в начале также является необязательным параметром, вы можете просто добавить дополнительную логику к default_url_options и вернуть ему пустой хэш всякий раз, когда вы не хотите этого поведения при префиксации.

+0

Это звучит Отлично! Я попробую и вернусь к вам. Дополнительные маршруты не должны быть проблемой. Это в стороне: как вы узнали об этом? Является ли это документированным где-то? Я, конечно, не вижу этого поведения в документации ' default_url_options', и я даже не нашел 'default_url_options', упомянутого рядом с' url_for' в API doc ... – AnoE

+0

Это то, что я сделал в нашем собственном программном обеспечении (нам нужен идентификатор номер, введенный в начало большинства URL-адресов для внутренних пользователей). Необязательные параметры на маршрутах - это просто ... дополнительные параметры в маршрутах, ничего особенного нет. Но я не помню, как я нашел 'default_url_options' - это было не последнее - я подозреваю, что пытался сделать некоторые уродливые исправления помощников путей, чтобы сделать необязательную работу параметра и наткнулся на нее. – DMA57361

 Смежные вопросы

  • Нет связанных вопросов^_^