其他 classes 中的命名空间 class 引用生成未初始化的常量错误

Namespaced class references inside other classes generate uninitialized constant errors

在我的 Rails 应用程序中,我正在自由使用 class 命名空间,如下所示:

class Person
  class PrimaryEmailAddress
    class Update < Trailblazer::Operation

      def persist(options, **)
        Shared::Property::HasOne::Update.(
          {property_class: PrimaryEmailAddress, property_value: @params[:email_address]},
          'current_user' => self['current_user'], parent_node: options[:person])
      end

    end
  end
end

不幸的是,ruby 解释器一直认为我的命名空间、嵌入式函数是其他 class' 命名空间的一部分,它会抛出 uninitialized constant 错误。即在运行时我得到这样的错误

uninitialized constant Person::Shared::Property

基本上,解释器正在查看此函数 Shared::Property::HasOne::Update 并将其视为在 Person 命名空间中,如果不在,则抛出错误。

我可以通过明确声明函数在 Object 命名空间中来解决这个问题,就像 Object::Shared::Property::HasOne::Update 一样,但是到处添加 Object:: 既烦人又难看.有没有人知道更好的解决方案?没有重写我所有的 class 名称/命名空间。

我想部分问题是 Person::Shared 是一个有效的命名空间,因此 ruby 解释器开始处理 Shared::Property:: ... 引用,就像我刚刚忘记添加 Person 到开头。

非常感谢任何反馈!!

找到答案:通过在 class 引用前添加 ::,我强制 ruby 解释器查看顶级命名空间。也就是说,我可以做 ::Shared::Property::HasOne::Update 而不是 Object::Shared::Property::HasOne::Update,我发现它更具可读性。

虽然有很多关于未初始化的常量问题的问题,但我很难找到这个答案,因为我发现的所有问题都是在特定情况下提出的,而不是被泛化。似乎 可能 这是一个重复的问题,我只是还没有找到另一个问题,但我会 post 这里的 QA 以防我错了这可以帮助其他人 运行 解决同样的问题。

This question 最终引导我找到正确答案。