是否可以在Draper装饰器中验证上下文?

时间:2013-07-26 05:28:57

标签: ruby decorator draper

我已经开始在我的新工作中与装饰师合作,并且发现他们真的很有帮助。我正在为我们的一个装饰师编写规格,并想知道是否可以这样做......

设置(精简版):

我们有一个有两个孩子的主要对象。

 Main
 / \
A   B

当Main被装饰时我们也装饰B,但我们必须通过A作为上下文。 A用于B的一些装饰器方法,但如上所述将A与B分开更具逻辑意义。

# in MainDecorator    
BDecorator.new(B, context: {a: A}) # all good

偶尔我们自己装饰B(不经过Main),我们忘记过去通过A作为上下文。我们总是抓住它,但这仍是一个令人讨厌的问题。

B.decorate # no context -> :(

问题:

是否可以验证A是否在B的装饰器中作为上下文传递?你有装饰验证器吗?

(我们考虑让A成为B的孩子,但这对我们的申请来说并不合理。我同意它会起作用,但这不是我们想要的。)

1 个答案:

答案 0 :(得分:2)

您可以覆盖初始化程序以验证是否传递了上下文:

class BDecorator
  def initialize(obj, options = {})
    raise "Must pass context" unless options.key? :context
    super
  end
end