Multi Domain Rails App. Как разумно использовать MVC?
-
13-10-2019 - |
Вопрос
Фон: у нас есть приложение A, B, и планируем добавить больше приложений в это же приложение. Приложения достаточно похожи, они могут поделиться многими взглядами, активами и действиями. В настоящее время A, B Live в одном приложении Rails (2.3.10). C будет достаточно похожим, что это также может быть в этом приложении Rails.
Проблема: поскольку мы продолжаем добавлять больше приложений в это одно приложение, будет слишком много логики случая, что приложение скоро станет кошмаром для обслуживания. Также будут потенциальные проблемы пространства имен. Тем не менее, приложения очень похожи по функции и макету, также имеет смысл держать их в одном приложении, так что это одно приложение для поддержания (поскольку примерно 50% внешнего вида/функциональности сайта будет обмен).
То, что мы пытаемся сделать, это сохранить это как можно более чистым, поэтому для нескольких команд легко работать и легко поддерживать.
Некоторые вещи, о которых мы думали/пытались: двигатели. Сделайте каждое приложение двигателем. Это позволило бы нам основать маршруты на домене. Это также позволяет нам вытащить контроллеры, модели и представления для конкретного приложения. Это решение не кажется идеальным, так как мы не будем повторно использовать приложения в ближайшее время. И явное заявление хоста на маршрутах не кажется правильным.
Скиннинг/Темы. Логика авторов будет отличаться между приложениями. Каждая пользовательская модель будет отличаться. Так что это не просто проблема с кожей.
В приложении/просмотре добавить папку Sitea для просмотров Sitea, SiteB для просмотров SiteB и так далее. Сделайте то же самое для контроллеров и моделей. Это по -прежнему довольно грязно, и, поскольку оно не последовало за соглашениями об именах, оно не так хорошо работало с рельсами и сделало большую часть кода.
Создание другого приложения Rails. Мы просто не хотели поддерживать тот же контроллер или представление в 2 приложениях, если они идентичны.
Что мы хотим сделать, так это сделать приложение разумно использовать контроллер на основе хоста. Таким образом, для каждого приложения будет контроллер сеансов, и, возможно, какой -то контроллер сеанса родительских сеансов для общей логики (сейчас не нужна). В каждом из этих контроллеров сеанса он обрабатывает аутентификацию для этого конкретного приложения. Таким образом, если домен является a.mysite.com, он будет использовать контроллер сеанса для приложения A и знать для использования представлений приложения A, моделей, контроллеров. И если домен является b.mysite, он будет использовать контроллер сеанса для b. И будет пользовательская модель для модели A и пользователя для B, которая также будет определена доменом.
У кого -нибудь есть какие -либо предложения или опыт работы в этой ситуации? И в идеале использовать Rails 2.3.x в качестве обновления до Rails 3 не вариант сейчас.
Решение
Придумать делает именно это. Вы бы хорошо ознакомились с его архитектурой и применить эту архитектуру к своему собственному делу.
У вас будет несколько отдельных приложений Rails. Общий код будет отдельным проектом, возможно, распределенным как драгоценный камень или, по крайней мере, отдельный репозиторий GIT. Общий код будет включать в себя множество действий контроллера и множество шаблонов представления, которые существуют разумные значения по умолчанию, и которые будут отменены в некоторых приложениях, но не в других.
Весь пользовательский код для приложения A будет принадлежать проекту, предназначенному исключительно для содержания пользовательского кода для приложения A. Он будет его собственным полностью функционирующим приложением Rails и будет в значительной степени зависеть от большинства разумных знаний, предоставленных общим кодом в Проект общего кода.
Другие советы
Я использовал плагин поддержки темы раньше и динамически устанавливал тему на основе URI запроса:
http://mattmccray.com/svn/rails/plugins/theme_support
Вероятно, потребуется некоторая работа для поддержки Rails 2.3.
Обновлять: Похоже, есть переписать: https://github.com/dasil003/rails-multisite
Похоже, вы хотите сделать приложение «базовое» плагин и использовать его в каждом из приложений вашего сайта. Вы можете использовать что-то вроде SVN-EXTERN, чтобы это автоматически обновлялось, когда что-то меняется.