Как я могу реализовать модуляцию в приложении Rails?
Ломать приложение больших рельсов в более мелкие приложения?
Модулирование приложений Rails
Лучшая практика структурирования приложения "больших" Rails
У меня есть быстрый вопрос о модуляции в большом приложении Ruby on Rails.
Настройка:
Я создаю основное приложение, которое хранит информацию о людях. У меня также есть несколько "модулей", которые используют эту информацию по-разному. (например, можно было отобразить информацию о людях, другое могло бы определить связи и общие черты между ними и т.д.).
Вопрос:
Как эффективно модулировать это приложение?
Потенциальные ответы:
Поскольку модули совместно используют модели и представления с основным приложением (и eachother), мне представляется целесообразным объединить их в одно приложение. Однако, поскольку приложение растет, это, очевидно, приведет к проблемам. Это для меня предлагает либо Namespacing контроллеров и моделей "Как организовать контроллер в довольно крупном приложении Rails? или с помощью движков Модулирование Rails-приложений ".
Поскольку модули находятся в активной разработке, очень полезно использовать на них генераторы рельсов, что, по-видимому, делает использование движками боли в прикладе. Также кажется, что, хотя двигатели полностью поддерживаются с точки зрения Rails, они по-прежнему кажутся довольно хакерскими в отношении отсутствия поддержки генератора и миграции базы данных. У кого-нибудь есть опыт разработки двигателей? Похоже, что двигатели были бы отличным решением, если бы у вас было рабочее приложение и вы захотели перенести его в плагин (например, скопировать код вставки), но если вы активно его разрабатываете (меняя модели и т.д.), Это будет сложно.
Последнее, что я видел, это использование нескольких приложений и одной базы данных. Этот путь кажется королевской болью с миграцией и поддержанием моделей прямо и т.д. И т.д. Но я думал, что тоже буду думать об этом.
Ответы
Ответ 1
Двигатели Rails кажутся правильным решением для вас. Я использовал двигатели, когда работал с Refinery CMS, который построен поверх Rails Engines.
Ниже приведены некоторые интересные ссылки, которые говорят о Rails Engines:
http://www.themodestrubyist.com/2010/03/01/rails-3-plugins---part-1---the-big-picture/
http://www.themodestrubyist.com/2010/03/05/rails-3-plugins---part-2---writing-an-engine/
http://www.themodestrubyist.com/2010/03/16/rails-3-plugins---part-3---rake-tasks-generators-initializers-oh-my/
http://www.themodestrubyist.com/2010/03/22/rails-3-plugins---part-4---more-on-generators/
Ответ 2
Я бы не использовал двигатели. Двигатели предназначены для использования функциональности между приложениями. То, что вы хотите сделать, - не разделить функциональность, а организовать ее.
Для организации вашего кода вы можете многое сделать.
- Использовать пространства имен.
- Держите ваши контроллеры тонкими.
- Сохраняйте свои модели тонкими (да, ваши модели, см. следующую маркерную точку)
- Используйте шаблон взаимодействия с данными (DCI).
- Используйте инфраструктуру виджетов, например Apotomo или Cells.
- Напишите тесты, чтобы вы могли реорганизовать.
- Рассмотрите сервис-ориентированную архитектуру (рассмотрите дизайн API Hypermedia), если ваша ответственность приложения растет слишком сильно.
У Andrzej есть очень хорошие статьи о DCI.
http://andrzejonsoftware.blogspot.com/2011/08/dci-patterns-how-to-write-dci-contexts.html
Ответ 3
- Одно приложение, одна база данных.
- Разделите модели между модулями.
- Пространство имен ваших контроллеров и представлений.
- Test.
Ответ 4
Вы также можете использовать Rack Middleware для обработки определенных задач.
Для основной части вашего приложения двигатели кажутся лучшим решением - это то, что я тоже делаю. Похоже, вы можете определить генераторы в Engine достаточно легко.
Ответ 5
В зависимости от структуры данных и шаблонов доступа может оказаться полезным разделить приложение на несколько приложений и, возможно, дополнительно обеспечить доступ к данным с помощью (RESTful) API.
По моему опыту, это позволяет создавать лучшие структуры, когда ваше приложение растет от среднего до большого размера и заставляет вас думать о структурах и разделять беспокойство. Масштабирование также обычно проще.