我有一个 Rails 项目,我已经研究了一段时间了。像许多 Rails 项目一样,我有一个 User 类。在我的一个控制器中,我需要从我正在使用的 gem 访问一些方法。 gem 中的示例代码演示了如何使用包含到特定 gem 模块。我不会在这里使用实际的 gem,因为它对问题并不重要。我无法控制这个 gem,我需要该模块的功能。
include GemName::Module
问题是 Gem 直接在我包含在控制器中的模块下包含它自己的 User 类。这会导致调用我自己的 User 类来调用 gem 的用户类中未定义的方法失败:
User.working?(:test_user)
NoMethodError (undefined method `working?' for GemName::Module::User:Class):
我想做的是将模块包含在我的控制器中and能够在同一控制器中使用我的应用程序的 User 类。
我测试了以下解决方法,这两种方法似乎都有效,但我对这两种方法都不是特别满意:
- 在包含 gem 模块之前创建一个新常量来引用我自己的用户类。
LocalUser = User
include GemName::Module
- 不要包含该模块并通过完全命名空间调用显式调用我可能需要的任何类。
GemName::Module::Class.method
我意识到我可以为我的 User 类命名,但这将涉及我的代码库的大量重构,而且我并不真正喜欢这个想法。该控制器从 gem 中调用类大约 20 次,而我自己的 User 类恰好调用一次。控制器never调用 gem 的 User 类。如果可能的话,我希望强制调用我自己的 User 类来显式引用我的非命名空间类,并保留对 gem 模块的包含。
希望有一个优雅的解决方案可以增加我对 Ruby 中命名空间的理解
就在发布问题后,我想“如果我在调用自己的非命名空间类时简单地在 User 前面添加 :: 会怎么样?”
果然,它有效。
::User.working?(:test_user)
调用我自己的用户类。
我将保留这个问题和这个答案,以防对其他人有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)