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

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

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

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

На данный момент я вижу в качестве основных вариантов следующие:

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

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


person MiniQuark    schedule 24.12.2008    source источник


Ответы (4)


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

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

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

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

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

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

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

person Mike Woodhouse    schedule 24.12.2008
comment
Мы пошли в Merb для одного из наших проектов специально для ломтиков. Работает достаточно хорошо. Мне любопытно, что произойдет при слиянии Rails 3. - person Otto; 24.12.2008
comment
Каким-то образом я пропустил (или забыл) плагин движка, пока не наткнулся на него снова сегодня. Теперь мне нужно найти время на каникулах, чтобы оценить, смогу ли я получить от этого то, что хочу. Хо, хм. Или хо-хо-хо обман? - person Mike Woodhouse; 25.12.2008

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

person Otto    schedule 24.12.2008

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

person Community    schedule 29.12.2008

На мой взгляд, для RoR нужно писать свои «приложения» как контроллеры в Rails. Они могут быть довольно независимыми, но могут иметь общие помощники и мнения. Я не знаю Django, может быть, терминология другая.

person Keltia    schedule 24.12.2008