如何检查常量是否存在

时间:2018-01-23 02:11:38

标签: ruby-on-rails

在Rails(5.1)应用程序中,我添加了一些装饰器并动态扩展需要它的对象。

我基本上有以下结构

decorators  
|__ users
|     |___ active.rb
|     |___ archived.rb
|__ organizations   
      |___ active.rb
      |___ archived.rb
      |___ main.rb

您可能会注意到,两个模型都会重复activearchived装饰器,并且它们也会被添加到其他模型中。

我已经能够使它们相同,所以我可以拥有一个装饰器。我想要的结构是

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,但我还没有找到一种方法将它用于我的目的。

是否有简单的"方式说:如果存在则使用此模块,否则寻找另一个模块?

谢谢你,祝你有个愉快的一天。

1 个答案:

答案 0 :(得分:0)

要直接回答标题,您使用defined?(Thing)打开了问题 - 它适用于类,模块,常量等。

检查名称空间/模块中是否定义了某些内容的优雅方法/ Decorators::Organizations.const_defined?("Active")