Сложная маршрутизация (несколько доменов, изменяющий путь): переопределение, хороший вариант?

#ruby-on-rails #ruby-on-rails-3 #routing #domain-driven-design #routes

#ruby-on-rails #ruby-on-rails-3 #маршруты #дизайн, управляемый доменом

Вопрос:

У меня возникли некоторые не очень простые проблемы с проектированием маршрутизации в rails 3.

У нас есть веб-сайт, переведенный на несколько языков. Некоторые из этих языков имеют полную поддержку домена, например :

 example.com -> english
example.es -> spanish
example.fr -> french
exemple.de -> german
... (lot more)
  

Но у нас также :

 example.com/zh-hans -> chinese
example.com/ru -> russian
... (lot more)
  

Я знаком с функцией ограничений (для совпадений? с request.host) но у меня много проблем с выяснением того, как сделать так, чтобы система маршрутизации хорошо работала с URL обоих типов.

Все сломалось, как только у нас появилось два разных типа запросов :

 host:example.es path:/everything-else
host:example.com path:/LANG/everything-else
  

Единственное решение, которое я нашел, — это перехватывать все маршруты match '*' => 'website#routing' и исправлять все вспомогательные пути, но я думаю, что это не лучший вариант для поддержки приложения в будущем.

Есть решения?

Ответ №1:

Я бы посоветовал настроить ваши маршруты так, чтобы они последовательно отображали все в path / LANG / …, а затем использовать ваш веб-сервер для перезаписи URL-адресов для доменов, зависящих от языка. Так, например, с Apache вы могли бы использовать что-то вроде этого:

     RewriteEngine On

    RewriteCond %{SERVER_NAME} example.de
    RewriteCond %{REQUEST_URI} !^/de
    RewriteRule ^.*$     http://%{SERVER_NAME}/de%{REQUEST_URI} [R]

    RewriteCond %{SERVER_NAME} example.es
    RewriteCond %{REQUEST_URI} !^/es
    RewriteRule ^.*$     http://%{SERVER_NAME}/es%{REQUEST_URI} [R]

    # etc.
  

(Я не уверен, что RewriteCond на самом деле правильный — предполагается, что «каждый путь запроса, который не начинается с ‘/ de’, ‘ / es’ и т.д.)

Комментарии:

1. Кажется отличным, я понимаю, что вы имеете в виду, это хорошая идея! Теперь мне интересно, как справиться с Rails url_helper, не нарушая путь? И еще, знаете ли вы способ сделать это непосредственно в Rails (в основном для доступа к нашей модели домена)?

2. Проверьте guides.rubyonrails.org /…

3. Хорошо, я понимаю.. Есть ли какие-либо отзывы об обслуживании rails за такими переписанными URL-адресами, как этот?