Как я могу реализовать модульность в приложении Rails? - PullRequest
11 голосов
/ 22 июля 2011

Разбить приложение большого рельса на более мелкие приложения?

Модуляризация приложений Rails

Наилучшая практика структурирования «большого»Приложение Rails

У меня быстрый вопрос по модульности в большом приложении Ruby on Rails.

Настройка:

Я создаю основное приложение, в котором хранится информация олюди.У меня также есть несколько «модулей», которые используют эту информацию по-разному.(например, один может отображать информацию о людях, другой может выяснить связи и сходства между ними и т. д.).

Вопрос:

Как эффективно модулировать это приложение?

Потенциальные ответы:

Поскольку модули совместно используют модели и представления с основным приложением (и еще одно) для меня имеет смысл объединить их в одно приложение.Однако по мере роста приложения это, очевидно, приведет к проблемам.Для меня это предлагает либо Namespacing для контроллеров и моделей " Как организовать контроллер в умеренно больших приложениях Rails? ", либо с использованием движков " Modularizing Rails application ".

Поскольку модули находятся в активной разработке, очень полезно использовать на них рельсовые генераторы, что, по-видимому, делает использование двигателей болью в заднице.Также кажется, что, хотя движки полностью поддерживаются с точки зрения Rails, они все еще кажутся хакерскими в связи с отсутствием поддержки генератора и миграцией базы данных.У кого-нибудь есть опыт разработки двигателей успешно?Кажется, что движки были бы отличным решением, если у вас есть работающее приложение и вы хотите перенести его в плагин (например, скопировать код вставки), но если вы активно его разрабатываете (меняете модели и т. Д.), Это будет сложно.

Последнее, что я видел вокруг, это использование нескольких приложений и одной базы данных.Это похоже на королевскую боль, связанную с миграциями, сохранением моделей и т. Д. И т. Д. Но я подумала, что тоже подумаю над этим.

Ответы [ 5 ]

1 голос
/ 07 марта 2012

Я бы не использовал двигатели. Двигатели предназначены для совместного использования функциональности между приложениями. То, что вы хотите сделать, это не делиться функциональностью, а организовать ее.

Чтобы организовать свой код, вы можете сделать много вещей.

  • Использовать пространства имен.
  • Держите свои контроллеры тонкими.
  • Сохраняйте свои модели тонкими (Да, ваши модели; см. Следующий пункт)
  • Использовать шаблон взаимодействия контекста данных (DCI).
  • Используйте каркас виджетов, такой как Apotomo или Cells.
  • Написать тесты, чтобы вы могли рефакторинг.
  • Рассмотрите сервис-ориентированную архитектуру (рассмотрите дизайн Hypermedia API), если ответственность вашего приложения слишком сильно возрастает.

Анджей имеет очень хорошие статьи о DCI.

http://andrzejonsoftware.blogspot.com/2011/08/dci-patterns-how-to-write-dci-contexts.html

1 голос
/ 22 июля 2011

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/

0 голосов
/ 07 марта 2012

В зависимости от структуры данных и шаблонов доступа может быть полезно разделить приложение на несколько приложений и, возможно, дополнительно, обеспечить доступ к данным с помощью (RESTful) API.

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

0 голосов
/ 07 марта 2012

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

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

0 голосов
/ 22 июля 2011
  • Одно приложение, одна база данных.
  • Совместное использование моделей между модулями.
  • Пространство имен ваших контроллеров и представлений.
  • Test.
...