我有一个正在从事一段时间的Rails项目。像许多Rails项目一样,我也有一个User类。在我的一个控制器中,我需要从正在使用的gem访问某些方法。 gem的示例代码演示了如何对特定gem模块使用include。我不会在这里使用实际的gem,因为它对这个问题并不重要。我无法控制这个gem,我需要模块的功能。
include GemName::Module
问题是Gem在我包含在控制器中的模块下直接包含了自己的User类。这导致无法在gem的用户类中定义的方法上调用我自己的User类:
User.working?(:test_user)
NoMethodError (undefined method `working?' for GemName::Module::User:Class):
我想做的就是能够将模块包含在控制器中 ,并且能够在同一控制器中使用应用程序的User类。
我已经测试了以下变通方法,这两个方法似乎都可行,但我都不满意:
LocalUser = User
include GemName::Module
GemName::Module::Class.method
我意识到我可以为我的User类命名空间,但是这涉及到围绕我的代码库的大量重构,而且我还是不太喜欢这个想法。该控制器从gem调用类大约20次,而我自己的User类恰好调用一次。控制器从不调用gem的User类。如果可能的话,我希望强制对我自己的User类的调用明确地引用我的非命名空间类,并将include包含在gem模块中。
希望有一个优雅的解决方案,它将增加我对Ruby中名称空间的理解
答案 0 :(得分:4)
就在发布问题之后,我想到了“如果我在调用自己的非命名类时在用户前面简单地广告::会怎样?”
果然可以。
::User.working?(:test_user)
调用我自己的User类。
我离开了问题和答案,以防万一。