1

在我的 Rails 应用程序中,我像这样自由地使用类命名空间:

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 解释器一直认为我的命名空间嵌入函数是其他类命名空间的一部分,并且会引发uninitialized constant错误。即在运行时我收到这样的错误

uninitialized constant Person::Shared::Property

基本上,解释器正在查看此函数Shared::Property::HasOne::Update并将其视为在Person名称空间中,当它不在时,然后抛出错误。

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

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

我真的很感谢任何反馈!

4

1 回答 1

2

找到了答案:通过::在类引用前面添加,我强制 ruby​​ 解释器查看顶级命名空间。ie 而不是Object::Shared::Property::HasOne::UpdateI can do ::Shared::Property::HasOne::Update,我发现它更具可读性。

虽然有很多关于未初始化的常量问题的问题,但我很难找到这个答案,因为我发现的所有问题都是在特定情况下构建的,而不是被泛化的。这似乎一个重复的问题,我只是没有找到另一个问题,但我将在此处发布此 QA,以防我错了,这有助于其他人遇到同样的问题。

这个问题最终引导我找到正确的答案。

于 2017-06-22T10:51:43.830 回答