Доступ к классу с пространством имен в gem против Rails

#ruby-on-rails #ruby #ruby-on-rails-6

#ruby-on-rails #ruby #ruby-on-rails-6

Вопрос:

Я работал с парой Ruby gems, а также с Rails. Одна вещь, которую я никогда до конца не понимал, — это почему Rails требовал явных ссылок на константы класса для кода, определенного в /lib папке. В рубиновом камне я мог бы создать что-то вроде этого:

lib/my_gem/custom_error.rb

 module MyGem
    class CustomError < StandardError

    end
end
 

lib/my_gem/some_class.rb

 module MyGem
    class SomeClass
    
        def initialize
            raise CustomError
        end
    end
end
 

Будь то ошибка, другой класс или что-то еще, если вызывающий класс находится в том же пространстве имен, что и ссылочный класс, ruby инициализирует правильный класс CustomError в приведенном выше случае. Переход к Rails, это другая история, и этот код приведет к неинициализированной постоянной ошибке. В Rails я должен был бы raise MyGem::CustomError сделать это вместо этого. Почему это так? Я предполагаю, что это как-то связано с автозагрузкой. Есть ли способ обойти это или это стандарт?

Комментарии:

1. Да, есть способы обойти это, но вы используете их на свой страх и риск. Вы захотите ознакомиться с автозагрузкой… guides.rubyonrails.org/v5.2 / … и поймите, что это также зависит от версии rails, которую вы используете.

2. Сравнить невозможно.