Ruby on rails 如何在构建ruby gem时要求类?

Ruby on rails 如何在构建ruby gem时要求类?,ruby-on-rails,ruby,gem,Ruby On Rails,Ruby,Gem,我正在创造一块宝石,以下是我的结构: lib/ | myapp.rb | myapp/ | version.rb | configuration.rb | use_cases/ | base_use_case.rb | entity1/ | show_entity.rb spec/ myapp.gemspec 我想让我的类ShowEntity继承自BaseUseCase module MyApp::

我正在创造一块宝石,以下是我的结构:

lib/
  | myapp.rb
  | myapp/
      | version.rb
      | configuration.rb
      | use_cases/
      |   base_use_case.rb
      |   entity1/
      |     show_entity.rb
spec/
myapp.gemspec
我想让我的类ShowEntity继承自BaseUseCase

module MyApp::UseCases::Entity1
  class ShowEntity < BaseUseCase
  end
end
模块MyApp::用例::Entity1
类ShowEntity
但是我得到了以下错误

in `<module:Entity1>': uninitialized constant MyApp::UseCases::Entity1::BaseUseCase (NameError)
“'”中的
:未初始化常量MyApp::UseCases::Entity1::BaseUseCase(NameError)
在myapp.rb中,我需要每个类,但仍然得到错误

这是我第一次尝试真正理解模块和类是如何协同工作的,并且在gem项目中需要它们,因此任何关于我为什么会出现这种错误的帮助或解释都将非常有用。

在您的代码中:

module MyApp::UseCases::Entity1
  class ShowEntity < BaseUseCase
  end
end
这里,当在当前范围中未找到
BaseUseCase
时,搜索的封闭范围为
MyApp::UseCases
。Ruby一次后退一个
模块
语句,由于现在有一个单独的
Entity1
声明,下一个范围是
MyApp::UseCases
,而不是顶层。如果将
BaseUseCase
直接定义在
MyApp
下,那么此代码也不会工作,因为在
MyApp::UseCases::Entity1
MyApp::UseCases
下找不到它之后,下一个搜索范围将是顶层

要解决此问题,您应该根据上述需要分解您的
模块
声明,或者明确定义
BaseUseCase的完全命名空间名称

class ShowEntity < ::MyApp::UseCases::BaseUseCase
类ShowEntity<::MyApp::UseCase::BaseUseCase

您的类BaseUseCase似乎是
MyApp::UseCase::BaseUseCase
而不是
MyApp::UseCase::Entity1::BaseUseCase
BaseUseCase
MyApp::UseCase::BaseUseCase
class ShowEntity < ::MyApp::UseCases::BaseUseCase