Мне интересно, есть ли какие-либо рекомендации по размещению нестандартных файлов Ruby в Rails-приложениях, которые не соответствуют ни одному из каталогов по умолчанию (controllers
/models
и т.д.).
Я говорю о классах, которые используются контроллерами/моделями и т.д., но не являются подклассами любого из базовых классов Rails. Классы, которые включают функциональность, извлеченную из моделей, чтобы сделать их менее жирными. Некоторые из них выглядят как модели, но не являются AR-моделями, некоторые из них больше похожи на "сервисы", некоторые - что-то среднее или что-то еще.
Несколько случайных примеров:
- "стратегии", которые обрабатывают аутентификацию с помощью пароля, через facebook и т.д.
- Объекты "XParams", которые инкапсулируют параметры или объекты "XCreator", которые обрабатывают обработку параметров для выполнения некоторого сложного действия, что в итоге приводит к созданию некоторых моделей AR в конце
- которые обращаются к внешним API-интерфейсам или инкапсулируют эти запросы и ответы
- поддельные модели, которые могут быть заменены реальной моделью AR (например, гостевой пользователь)
- Задачи Resque
- классы, которые хранят и читают информацию из Redis
- которые выполняют некоторые конкретные действия, такие как обработка данных, генерация отчетов и т.д. и вызываются из задач Resque или задач грабли.
Теперь у меня их довольно много, некоторые из них добавлены в lib
, который заканчивается как куча случайных классов и модулей, некоторые пробираются в app/models
. Я хотел бы как-то это организовать, но я не знаю, с чего начать.
Должны ли только модели AR входить в app/models
? Или это нормально, чтобы добавить туда какие-либо доменные или вспомогательные модели? Как вы решаете, является ли что-то моделью?
Если все, что не вписывается в app
, перейдите в lib
? Или, может быть, я должен добавить несколько новых настраиваемых подкаталогов в app
? Какие подкаталоги и как разделить пользовательские классы?
Как вы справляетесь с этим в своих проектах? Я знаю, что каждый проект немного отличается, но должно быть некоторое сходство.