Проблема: Создание модуля в lib для хранения функций и включение модуля в класс создаст загрузку методов экземпляра для класса.
Сначала организуйте, затем оптимизируйте
Проблема: как насчет функций, которые распространены и необходимы во всех трех?
У вас действительно есть методы, которые нужны во всех трех и еще не существуют?
Если да, может быть, вы можете дать пример
Я думаю, что вопрос должен быть в том, где поставить логику в целом.
Сначала вы должны подумать о том, что делает ваш метод, прежде чем думать о том, куда его поместить.
Но что бы вы ни создавали, когда оно становится большим и / или ценным, вы должны подумать об экспорте его как о драгоценном камне / плагине.
Логика внутренней навигации (что отображать и куда идти после действия): контроллеры
- Приложение для навигации по логике; application_controller
- Подмножество логики приложения; создать пространство имен с главным контроллером, класс API_controller
Логика данных (Как манипулировать, обрабатывать данные): Модели
- Данные; Метод класса модели (поиск, сортировка, подсчет, макропроцесс ...)
- Datum; Метод экземпляра модели (модификация, микропроцесс ...)
Логика представления данных (как отображать данные): вспомогательные, частичные и декораторы
- Помощник не предназначен для этого, по моему мнению.
- Частичное разметка дескрипторов конкретных данных.
- приложение-декоратор; справка по представлению общих данных
- scope_decoration; Вы можете использовать наследство
Логика языка компоновки (справка по языку компоновки): Помощник
- Специфично для вашего приложения; application_helper
- Специфично для модели ...; model_helper, но вы должны рассмотреть декоратор
- Generic; экспортировать его в гем (супер помощник по формам, система шаблонов ...)
Логика макета (я должен отобразить это меню?):?
- Помощник / декоратор / модель может ответить на вопрос: @ user.can_edit? (@ Article)
- Макет обрабатывает отображение <% = рендер: частичный => разрешено? "что-то": "что-то еще"%>
Я думаю, что если вы не в этой конфигурации, вы создаете некую бэкэнд-систему.
Так что это должно войти в lib, потом в гем.
Эта организация просто пример. Самое главное - организовать свой код и разделить различные логические слои, и не стесняйтесь реорганизовать / экспортировать код, чтобы сделать его универсальным после добавления новых функций ...