其他 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 最终引导我找到正确答案。
在我的 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 最终引导我找到正确答案。