在我的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
添加到开头一样。
我真的很感激任何反馈!!
答案 0 :(得分:2)
找到答案:通过在类引用前添加::
,我强制ruby解释器查看顶级命名空间。即{而不是Object::Shared::Property::HasOne::Update
我可以做::Shared::Property::HasOne::Update
,我发现它更具可读性。
虽然关于未初始化的常数问题存在相当多的问题,但我很难找到这个答案,因为我发现的所有问题都是在特定情况下构建的,而不是通用化。似乎很可能这是一个重复的问题,我只是没有找到另一个问题,但我会在这里发布这个QA,以防我错了,这有助于其他人遇到同样的问题。
This question最终导致我得到了正确答案。