【发布时间】:2018-11-09 20:54:13
【问题描述】:
我正在按照“胖模型/瘦控制器”模式开发 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
它越来越多地妨碍日志记录和验证与订阅行为的结合。我知道我应该通过将日志记录和验证移动到decorators 来解决这个问题,可能使用draper。
我对装饰师没有太多经验。我主要担心的是由于代码在应该使用装饰模型时使用未装饰模型而导致的错误。或相反亦然。接口是一样的,变化是副作用,所以很难察觉。
我很想大量使用 decorates_association 和 decorates_finders 来避免这种情况,但 Draper 文档说要避免这种情况......
装饰器的行为应该与它们装饰的模型非常相似,因此很容易在控制器操作开始时装饰您的对象,然后在整个过程中使用装饰器。不要。
但是,Draper(以及我能找到的大多数 Rails + Decorator 文章)似乎都专注于视图功能......
因为装饰器被设计为被视图使用,所以你应该只在那里访问它们。操作您的模型以准备好东西,然后在渲染视图之前的最后一分钟进行装饰。这避免了在创建装饰器(特别是集合装饰器)之后尝试修改装饰器时出现的许多常见缺陷。
与视图功能不同,您有一个控制器来确保传递给视图的模型被装饰,我的装饰器用于模型功能。装饰器主要用于代码组织和易于测试,几乎所有东西都应该使用装饰模型。
使用装饰器添加模型功能的最佳做法是什么?总是使用装饰模型?更激进的方法,比如将订阅和取消订阅转移到另一个类?
【问题讨论】:
标签: ruby-on-rails model-view-controller decorator