如何将自己的班级与宝石班级进行歧义

时间:2019-10-25 12:36:29

标签: ruby-on-rails ruby namespaces

我有一个正在从事一段时间的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类。

我已经测试了以下变通方法,这两个方法似乎都可行,但我都不满意:

  1. 在包含gem模块之前,创建一个新常量以引用我自己的用户类。
LocalUser = User
include GemName::Module
  1. 请勿包含该模块,并使用完全命名空间的调用显式调用我可能需要的任何类。
GemName::Module::Class.method

我意识到我可以为我的User类命名空间,但是这涉及到围绕我的代码库的大量重构,而且我还是不太喜欢这个想法。该控制器从gem调用类大约20次,而我自己的User类恰好调用一次。控制器从不调用gem的User类。如果可能的话,我希望强制对我自己的User类的调用明确地引用我的非命名空间类,并将include包含在gem模块中。

希望有一个优雅的解决方案,它将增加我对Ruby中名称空间的理解

1 个答案:

答案 0 :(得分:4)

就在发布问题之后,我想到了“如果我在调用自己的非命名类时在用户前面简单地广告::会怎样?”

果然可以。

::User.working?(:test_user)

调用我自己的User类。

我离开了问题和答案,以防万一。