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

时间:2017-06-22 10:51:44

标签: ruby-on-rails ruby trailblazer

在我的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添加到开头一样。

我真的很感激任何反馈!!

1 个答案:

答案 0 :(得分:2)

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

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

This question最终导致我得到了正确答案。