Ссылки на пространства имен в других классах генерируют неинициализированные постоянные ошибки
В моем приложении 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 ответ
Нашел ответ: добавив ::
перед ссылкой на класс я заставляю интерпретатор ruby просматривать пространство имен верхнего уровня. т.е. вместо Object::Shared::Property::HasOne::Update
я могу сделать ::Shared::Property::HasOne::Update
, который я считаю более читабельным.
Хотя существует довольно много вопросов о неинициализированных постоянных проблемах, у меня возникли проблемы с поиском этого ответа, потому что все вопросы, которые я обнаружил, были сформулированы в конкретных случаях, а не обобщены. Кажется вероятным, что это дублирующий вопрос, и я просто не нашел другой, но я собираюсь опубликовать этот QA здесь на случай, если я ошибаюсь, и это поможет кому-то еще столкнуться с этой же проблемой.
Этот вопрос привел меня к правильному ответу.