提问人:Scott 提问时间:10/25/2019 更新时间:7/25/2021 访问量:181
我怎样才能将我自己的类与宝石类区分开来
How can I disambiguate my own class from a gem's class
问:
我有一个 Rails 项目,我已经做了一段时间了。像许多 Rails 项目一样,我有一个 User 类。在我的一个控制器中,我需要从我正在使用的 gem 中访问一些方法。Gem 中的示例代码演示了如何使用 include to 特定 Gem 模块。我不打算在这里使用实际的宝石,因为它对问题并不重要。我无法控制这个 gem,我需要模块的功能。
include GemName::Module
问题在于 Gem 直接在我包含在控制器中的模块下包含自己的 User 类。这会导致对我自己的 User 类对 gem 的用户类中未定义的方法的调用失败:
User.working?(:test_user)
NoMethodError (undefined method `working?' for GemName::Module::User:Class):
我想做的是能够将模块包含在我的控制器中,并能够在同一控制器中使用我的应用程序的 User 类。
我已经测试了以下解决方法,这两种方法似乎都有效,但我对这两种方法都不是特别满意:
- 在包含 gem 模块之前,创建一个新常量来引用我自己的用户类。
LocalUser = User
include GemName::Module
- 不要包含该模块,而是使用完全命名空间调用显式调用我可能需要的任何类。
GemName::Module::Class.method
我意识到我可以命名我的 User 类,但这将涉及围绕我的代码库进行大量重构,无论如何我都不喜欢这个想法。这个控制器从 gem 调用类大约 20 次,而我自己的 User 类只调用一次。控制器从不调用 gem 的 User 类。如果可能的话,我很想强制调用我自己的 User 类以显式引用我的非命名空间类,并将 include 保留到 gem 模块。
希望有一个优雅的解决方案,可以增加我对 Ruby 中命名空间的理解
答:
4赞
Scott
10/25/2019
#1
刚发布问题后,我就想“如果我在调用自己的非命名空间类时简单地在 User 前面添加 :: 会怎样?
果然,它起作用了。
::User.working?(:test_user)
调用我自己的 User 类。
我把这个问题和这个答案留给其他人,以防它对其他人有所帮助。
评论