Как я могу разделить большое приложение Rails на более мелкие приложения, которые работают вместе? - PullRequest
7 голосов
/ 24 декабря 2008

Я немного поработал с Django, и мне очень нравится его модель проекта / приложения: вы можете создать проект Django, собрав одно или несколько приложений Django. Эти приложения могут быть автономными, или некоторые приложения могут быть построены поверх других приложений. Приложение может легко полагаться на модели другого приложения, а также на свои контроллеры (парни из Django называют их «представлениями») и даже свои представления («шаблоны» на языке Django-говорить).

Сейчас я работаю над относительно масштабным проектом Ruby on Rails, и я удивлен, увидев, что в Rails, очевидно, нет простого способа сделать то же самое. По сути, в Rails один проект = одно приложение. Наш проект начался как огромное монолитное приложение, и сейчас мы пытаемся выяснить, как разделить его на более мелкие куски.

Например, наше текущее приложение позволяет нам управлять партнерами и контрактами (среди прочего). Я хотел бы иметь приложение «Партнеры», которое будет управлять нашими партнерами (адрес, контакты и т. Д.), И приложение «Контракты», которое будет управлять нашими контрактами с нашими партнерами. Приложение «Контракты» будет опираться на приложение «Партнеры» (но чтобы избежать круговой зависимости, я бы хотел, чтобы приложение «Партнеры» не знало о приложении «Контракты»).

Пока я вижу следующие основные параметры:

  1. заставить эти приложения взаимодействовать через запросы REST (каждое приложение будет действовать как веб-служба): это хорошо, но, похоже, запрещает повторное использование представлений других приложений. Например, если в приложении «Партнеры» есть хорошая страница для отображения сведений о партнере, и если я хочу отобразить эту страницу, слегка измененную, в середине страницы сведений о контракте, я не вижу другого способа сделать это. это значит, что приложение «Контракты» запрашивает у партнера «Партнеры» сведения о партнере через запрос REST (он получает представление объекта, а не представление), а затем копирует / вставляет исходный код страницы сведений о партнере из раздела « Партнеры »в приложении« Контракты ».
  2. превращает эти приложения в плагины: не так приятно и немного сложнее, но, кажется, позволяет повторно использовать модель и виды
  3. используйте svn external для обмена некоторыми моделями из приложения в приложение: просто, но безобразно.

Спасибо за советы.

Ответы [ 4 ]

5 голосов
/ 24 декабря 2008

Поскольку это то, что я тоже хотел бы сделать, я могу предложить четыре - неполных и относительно непроверенных (мной) «решения»:

В произвольном порядке ...

  1. Используйте плагин Rails engine , который теперь работает с 2.2. Это, в некоторой степени или полностью, вероятно, будет добавлено в Rails 2.3 (см. Ниже)

  2. Переключиться на Мерб , который есть то, что называется "ломтики", что может предложить то, что вы ищете. Во всяком случае, если это правильно (а кто я такой, чтобы сомневаться Иегуда Кац?) Все будет одинаково В любом случае, однажды, это круто.

  3. Взгляните на функциональность движков в Edge Rails («Edge» - самая последняя версия, но не выпущенная, поэтому обычно она работает, но может и не достигать 100% качества производства).

  4. Изучите использование пространств имен в route.rb - выделение элемента в пределах app для пространства имен означает, что вы можете поместить его в подкаталог в соответствующем подкаталоге app, хотя это возможно, менее чисто, чтобы иметь отдельный набор каталогов Rails для каждого «приложения».

Из них у меня нет опыта (2), потому что я привязан (в терминах инфраструктуры) к Rails, но это нормально, мне нравится Rails. Я планирую взглянуть на (1) и, возможно, (3), потому что 2.3 может быть выпущен до того, как мне понадобится развернуть мой следующий основной выпуск, и я попробовал (4), который работает, но, ну, конечно немного (для меня) сбивает с толку.

2 голосов
/ 29 декабря 2008

Я использовал плагин пустыни (ранее «Плагины плюс»). Кажется, работает довольно хорошо. http://github.com/pivotal/desert/tree/master

2 голосов
/ 24 декабря 2008

Если вы хотите изучить вариант № 2 Майка, Мерб разрезает на скринкаст на полезную тему .

0 голосов
/ 24 декабря 2008

Я думаю, что для RoR было бы написать ваши "приложения" в качестве контроллеров в Rails. Они могут быть совершенно независимыми, но могут делиться своими помощниками и взглядами. Я не знаю Джанго, так что, возможно, терминология другая.

...