Что является заменой для ActionController :: Base.relative_url_root? - PullRequest
20 голосов
/ 05 июля 2010

Я портирую приложение 2.x rails на rails3; мы назовем это foo-app. Foo-приложение является одним из разделов большого приложения rails и находится по адресу main_rails_app.com/foo-app. Ранее мы просто настраивали следующее в нашей рабочей конфигурации foo-app, чтобы гарантировать правильную работу наших маршрутов foo-app:

ActionController::Base.relative_url_root = "/foo-app"

Однако с rails3 я теперь получаю:

DEPRECATION WARNING: ActionController::Base.relative_url_root is ineffective. Please stop using it.

С тех пор я изменил запись конфигурации следующим образом:

config.action_controller.relative_url_root = "/foo-app"

В основном это работает в том, что все вызовы внешних ресурсов (javascript / css / images) будут использовать / foo-app. Однако, ни один из моих маршрутов не изменяется должным образом, или, иначе говоря, foo-app root_path выдает мне «/», когда я ожидаю «/foo-app'.

Два вопроса:

  1. Что является заменой для ActionController :: Base.relative_url_root
  2. если это config.action_controller.relative_url_root, то почему мои маршруты не отражают значение относительного_url_root, которое я установил?

Ответы [ 3 ]

19 голосов
/ 21 июля 2010

Вы должны иметь возможность обрабатывать все это в файле rout.rb. Оберните все ваши текущие маршруты в область видимости; например.

scope "/context_root" do
   resources :controller
   resources :another_controller
   match 'welcome/', :to => "welcome#index"
   root :to => "welcome#index"
end

Затем вы можете проверить свою маршрутизацию с помощью rake routes, в которой они должны соответственно отображать ваши маршруты, включая корневой контекст (lative_url_root)

13 голосов
/ 28 марта 2011

При развертывании через Passenger используйте директиву RackBaseURI: http://www.modrails.com/documentation/Users%20guide%20Apache.html#RackBaseURI

В противном случае вы можете обернуть оператор run в config.ru следующим блоком:

map ActionController::Base.config.relative_url_root || "/" do
  run FooApp::Application
end

Тогда вам нужно только установить переменную окружения RAILS_RELATIVE_URL_ROOT в "/ foo-app". Это относится даже к маршрутам, установленным в гемах или плагинах.

Предупреждение: не смешивайте эти два раствора.

5 голосов
/ 28 марта 2014

Мне кажется, что я, должно быть, слишком усложняю это и / или что-то упускаю, но эта проблема уже давно меня расстраивает, и вот мои заметки.

Резюме

Есть две отдельные проблемы с двумя точками, каждая для динамических и статических маршрутов:

  1. как получить маршрутизацию для правильного соответствия входящего URL-адреса
    • для маршрутов
    • для статическихфайлы
  2. как генерировать URL-адреса, включающие относительный_кат
    • с помощью помощников по URL
    • для статических ресурсов

Один способ решить все четыре точки:

  • Сконфигурировать Nginx для удаления части relative_root
    • Это решает сопоставление маршрута;просто пишите маршруты, ожидающие URL-адреса на /, как в разработке
    • Также статические файлы обслуживаются как в разработке
  • Установить RAILS_RELATIVE_URL_ROOT переменную среды
    • Thisрешает сгенерированные помощники статического ресурса
  • Используйте промежуточное ПО ScriptName ниже (измените его, чтобы использовать значение из среды)
    • Это решает сгенерированные помощники URL, например users_path

Упаковка приложения Rails в Rack :: URLMap на config.ru (ответ Кристофа) * ​​1054 * # config.ru map '/relative_root' do run Myapp::Application end требует, чтобы входящий URL содержалlative_url_root (Nginx может быть настроен на удаление или сохранение этого; см. ниже) Стойка добавляет относительный_url_root к стойке env SCRIPT_NAME rack / urlmap.rb: 62 Rails добавляет текущий запрос SCRIPT_NAME к параметрам url_for metal / url_for.rb: 41 url_for Rails добавляет имя сценария при генерации путей routing / url_for.rb:133 Так что охватывает URLгенерируется помощниками по URL, например, с учетом UserController, users_path будет префикс относительного корня URL. Установить SCRIPT_NAME в промежуточном программном обеспечении

# config.ru
class ScriptName
  def initialize(app, name)
    @app = app
    @name = name
  end

  def call(env)
    env['SCRIPT_NAME'] += @name
    @app.call(env)
  end
end

use ScriptName, '/relative_root'
run Rails.application
  • Имеет тот же эффект, что ивыше, но
  • Требуется, чтобы входящий URL НЕ содержал относительный_url_root

Установка RAILS_RELATIVE_URL_ROOT

  • сохраняется в app.config.relative_url_root configuration.rb: 41
  • , что, в свою очередь, влияет на пути к активам asset_url_helper.rb: 137
  • , но, насколько я понимаю,
  • особенно заметноне влияет на помощников URL

Настройка config.action_controller.relative_url_root

  • ??Может повлиять на компиляцию активов?
  • Переопределяет RAILS_RELATIVE_URL_ROOT env var?

Явное определение всех маршрутов в /relative_root (ответ Риззы)

# config/routes.rb
Myapp::Application.routes.draw do
  scope '/relative_root' do
    ...
  end
end
  • Urlпомощники будут генерировать правильные URL-адреса
  • Входящий URL-адрес должен содержать относительный корень URL-адреса (чувствителен к конфигурации Nginx, см. ниже), в противном случае исключения «без совпадения маршрута»
  • URL-адреса, запрашивающие статические ресурсы, например /relative_root/images/logo.png приведет к исключениям «нет совпадений маршрутов».Это может не быть проблемой, если nginx все равно обслуживает статические ресурсы.

Конфигурация Nginx

Учитывая такую ​​конфигурацию, как:

upstream myapp {
  server localhost:3000;
}

server {
  ...
  location /relative_root {
    proxy_pass http://myapp/;
  }
}

Nginx будет удален/relative_root, и приложение Rails не увидит его.Если вам нужно приложение Rails, чтобы увидеть его, можно изменить строку proxy_pass:

...
    proxy_pass http://myapp/relative_root/;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...