Ссылки на пространства имен в других классах генерируют неинициализированные постоянные ошибки

В моем приложении 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 здесь на случай, если я ошибаюсь, и это поможет кому-то еще столкнуться с этой же проблемой.

Этот вопрос привел меня к правильному ответу.

Другие вопросы по тегам