ruby - 是否可以验证 Draper 装饰器中的上下文?

标签 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 的子级,但这对我们的应用程序来说并没有真正意义。我同意它会起作用,但这不是我们想要的。)

最佳答案

您只需重写初始化程序即可验证上下文是否已传递:

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

关于ruby - 是否可以验证 Draper 装饰器中的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17873602/

相关文章:

ruby - 如何修复错误 : "\xC3" on US-ASCII when bootstrapping chef-client?

python - 通用函数/对象加倍装饰器在 Python 中是否可行?

python - 自定义装饰器在 django 中触发异常 `' 函数'对象没有属性 'get' `

ruby-on-rails - 装饰实例上未定义的方法

ruby-on-rails - 带有 Bootstrap 分页的 Draper - 未定义的方法 'total_pages'

Rubymine 6.0.2,无法调试

ruby - 无限可枚举

ruby - 从关联 block 中递归调用 Ruby 方法。还有别的办法吗?