Как поделиться кодом между работой и контроллером - PullRequest
0 голосов
/ 03 марта 2020

У меня есть некоторые функции в контроллере, которые я также хочу в фоновом режиме (ActiveJob). Если бы код был одинаковым в обоих случаях, чтобы избежать дублирования кода, я полагаю, что правильным способом было бы перенести общую функциональность в задание и выполнить задание (perform_now) с контроллера?

Но Что делать, если код не все равны, где мне нужно только некоторые методы в обоих, что будет правильным способом для этого? Будет ли перемещение общего кода в методы класса

  • publi c в классе задания и вызов их из контроллера?
  • libs? (Или они слишком общие?)
  • касается?
  • помощников?

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

1 Ответ

0 голосов
/ 04 марта 2020

Обе заботы и помощники - это просто модули. И, таким образом, оба могут быть использованы для параллельного наследования.

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

«заботы» - это на самом деле соглашение Rails, которое добавляет папки app/controller/concerns и app/models/concerns к автозагрузка root каталогов. В отличие от помощников, они не включаются автоматически в ваш контроллер. Если вы хотите использовать модульные миксины, это, вероятно, будет хорошим местом.

Если функциональность представляет собой простой набор методов, это может быть хорошим выбором. Существует множество замечательных применений таких модулей, как Enumerable, которые действительно обеспечивают набор поведений для широкого спектра классов, но большинство модулей, как правило, являются общеизвестными мусорными ящиками.

Разделение вещей не делает все проще - это только означает, что я могу притворяться, что мои файлы маленькие и что мой основной модуль не имеет такого большого количества методов. Несмотря на то, что я написал код, я постоянно путаюсь, какой файл содержит какой метод. Во всяком случае, разбиение файлов таким образом усложняет мою работу сопровождающего.
- Схемы

Себастьян Пальма коснулся одного решения этой проблемы - Объекты обслуживания . Задания на самом деле являются просто более сложным типом сервисного объекта, но вы можете создать сервисный объект, который инкапсулирует функциональность, совместно используемую контроллером и заданием, если функциональность этого требует.

publi c Методы класса в класс работы, и вызывать их из контроллера?

Ад №. Джобс должен просто выполнять одну работу и делать это хорошо. Создайте больше рабочих мест / объектов обслуживания, если это необходимо. Не превращайте хороший одноцелевой объект в ящик для мусора.

Резюме

Какие типы создаваемых вами объектов имеют такое же значение, как и то, где вы их размещаете. Нет простого и быстрого ответа - вам нужно внимательно посмотреть на то, что делает код:

  • Это обобщенное c поведение, которое может расширять несколько классов? Миксин модуля и / или шаблон макроса.
  • Требуется ли какой-то ввод и выполнение единицы работы? Служебный объект / задание.
  • Делает ли он HTTP-вызовы или каким-либо другим образом затрагивает границу приложения? Клиентский объект.
  • Инкапсулирует ли он какую-то деловую логику c с действующими на него правилами? Модель / виртуальная модель.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...