Fralunia
@Fralunia

Rails4, как задать relative_url_root отличный от '/'?

Приветствую Тостеряне. Мозг в огне. Помогите, потушить пожар
Решая задачу по упрощению деплоя Rails приложений в демо окружение, столкнулся с парочкой проблем.

Фабула:
Захотелось что бы деплой для демо окружения проходил, при минимальном участии рук.
А именно, складывать все демо-приложения, для демонстрации, в папочки /var/www/apps/demo/$sitename/current/public
и что бы nginx разруливал $sitename исходя из адреса demo.server.ru/sitename.
Это успешно удалось реализовать тут.

Но нависла новая проблема, Rails говорит:
ActionController::RoutingError (No route matches [GET] "/sitename"):


Поиски привели меня к такому решению. Но проблему это не решило
// config/enviroments/production.rb
config.relative_url_root = "/sitename"
config.action_controller.relative_url_root = "/sitename"


Единственное как удалось заставить, хоть как то заработать маршруты, это напрямую, грубо, добавить в config.ru
map '/sitename' do
    run Myapp::Application
end

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

При написании уже пришло в голову использовать поддомены, и тогда, наверное, получится избежать этой проблемы.
Но всё же хочется понять, как задать рельсам начальный путь, отличный от корня.
  • Вопрос задан
  • 276 просмотров
Решения вопроса 1
Fralunia
@Fralunia Автор вопроса
В общем закончилась история успехом.

Оказалось что проблема в маршрутизации была со статическими страницами из-за гема High_Voltage.
Обойти эту проблему можно, так.
# config/initializers/high_voltage.rb
HighVoltage.configure do |config|
  config.routes = false
end


В routes.rb указываем scope и заворачиваем high_voltage на свой контроллер.
(подробнее https://github.com/thoughtbot/high_voltage)
# config/routes.rb
Rails.application.routes.draw do
  scope '/appname' do
    #переопределяем дефолтный путь high_voltage на свой Page контроллер 
    get "/pages/*id" => 'pages#show', as: :page, format: false
    
    resources :events
    root 'home_page#index'
  end
end


Итоговый конфиг nginx:

server {
  listen 80;

  client_max_body_size 4G;
  keepalive_timeout 10;

  error_page 500 502 504 /500.html;
  error_page 503 @503;

  server_name demo.server.ru;

  root /var/www/apps/demo/app_name/current/public;

  location /app_name{
    try_files $uri @app_name_production;
  }

  location @app_name_production {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_pass http://unicorn_app_name_production;

    access_log /var/log/nginx/app_name_production.access.log;
    error_log /var/log/nginx/app_name_production.error.log;
  }

  location ^~ /assets/ {

    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  location = /50x.html {
    root html;
  }

  location = /404.html {
    root html;
  }

  location @503 {
    error_page 405 = /system/maintenance.html;
    if (-f $document_root/system/maintenance.html) {
      rewrite ^(.*)$ /system/maintenance.html break;
    }
    rewrite ^(.*)$ /503.html break;
  }

  if ($request_method !~ ^(GET|HEAD|PUT|PATCH|POST|DELETE|OPTIONS)$ ){
    return 405;
  }

  if (-f $document_root/system/maintenance.html) {
    return 503;
  }

}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы