在Rails(5.1)应用程序中,我添加了一些装饰器并动态扩展需要它的对象。
我基本上有以下结构
decorators
|__ users
| |___ active.rb
| |___ archived.rb
|__ organizations
|___ active.rb
|___ archived.rb
|___ main.rb
您可能会注意到,两个模型都会重复active
和archived
装饰器,并且它们也会被添加到其他模型中。
我已经能够使它们相同,所以我可以拥有一个装饰器。我想要的结构是
decorators
|___ active.rb
|___ archived.rb
|__ organizations
|___ main.rb
我现在面临的问题是如何知道我需要哪个装饰器来扩展我的模型。我的意思是如何确定装饰器是否在Decorators
模块(即Decorators::Active
)内或Decorators::Organizations
模块内(即Decorators::Organizations::Main
)?
目前,这是静态的,因为它总是装饰器加上模型的复数名称。
我的第一个想法是使用method_missing
,但这意味着我必须保留重复的文件并添加类似
def method_missing(method, *args, &block)
Decorators::Active.send(method, *args, &block)
end
在Decorators::Organizations::Active
装饰者中。
我也看过const_misisng
,但我还没有找到一种方法将它用于我的目的。
是否有简单的"方式说:如果存在则使用此模块,否则寻找另一个模块?
谢谢你,祝你有个愉快的一天。
答案 0 :(得分:0)
要直接回答标题,您使用defined?(Thing)
打开了问题 - 它适用于类,模块,常量等。
检查名称空间/模块中是否定义了某些内容的优雅方法/ Decorators::Organizations.const_defined?("Active")