Я занимаюсь разработкой приложения на Rails 5 по шаблону «толстая модель / тонкий контроллер».По мере того, как я добавляю такие вещи, как регистрация и проверка, я обнаруживаю, что мои модели становятся слишком толстыми.Например, вот набросок того, как выглядит метод подписки на список ...
class SubscriberList < ApplicationRecord
# relationships and validations
def subscribe!(args)
log that a subscription is attempted
begin
do the subscription
rescue errors
log the failure and reason
rethrow
end
log successful subscription
log other details about the subscription
SubscriptionValidationJob.perform_later( new_subscriber )
return new_subscriber
end
end
Все более усложняется то, что регистрация и валидация сводятся к подписке.Я понимаю, что должен решить эту проблему путем перемещения регистрации и проверки в декораторы , вероятно, используя draper
.
У меня нет большого опыта работы с декораторами.Моя главная проблема - ошибки из-за того, что в коде используется недекорированная модель, когда она должна использовать декорированную модель.Или наоборот.Интерфейсы одинаковы, изменения являются побочными эффектами, поэтому их будет трудно обнаружить.
Я бы соблазнительно использовал decorates_association
и decorates_finders
, чтобы избежать этого, но документация Draper гласит:чтобы избежать этого ...
Предполагается, что декораторы ведут себя очень похоже на модели, которые они украшают, и по этой причине очень заманчиво просто декорировать ваши объекты в начале действия вашего контроллера, а затемиспользовать декораторы во всем.Не.
Однако Draper (и большинство статей о Rails + Decorator, которые я смог найти), похоже, сосредоточены на функциональности представления ...
Поскольку декораторы разработанычтобы быть поглощенным видом, вы должны иметь к ним доступ только там.Манипулируйте вашими моделями, чтобы подготовить вещи, а затем украсьте в последнюю минуту, прямо перед визуализацией.Это позволяет избежать многих распространенных ошибок, возникающих при попытке модифицировать декораторы (в частности, декораторы коллекций) после их создания.
В отличие от функциональности представления, где у вас есть контроллер, обеспечивающий передачу моделей моделям.взгляд украшен, мои декораторы для функциональности модели.Декоратор в основном для организации кода и простоты тестирования, почти все должны использовать декорированную модель.
Каковы наилучшие практики использования декораторов для добавления к функциональности модели?Всегда использовать декорированные модели?Что-то более радикальное, например перенос подписки и отписки в другой класс?