Как я могу реализовать модуляцию в приложении 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.

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