У меня есть проект Rails, над которым я работаю некоторое время. Как и во многих проектах Rails, у меня есть класс User. В одном из моих контроллеров мне нужно получить доступ к некоторым методам из драгоценного камня, который я использую. Пример кода из драгоценного камня демонстрирует использование включения в конкретный модуль драгоценного камня. Я не собираюсь использовать настоящий драгоценный камень здесь, потому что это не важно для вопроса. У меня нет контроля над этим драгоценным камнем, и мне нужны функциональные возможности от модуля.
include GemName::Module
Проблема в том, что Gem включает свой собственный класс User непосредственно под модулем, который я включил в свой контроллер. Это приводит к вызовам моего собственного класса User к методам, не определенным в пользовательском классе гема:
User.working?(:test_user)
NoMethodError (undefined method `working?' for GemName::Module::User:Class):
Что я хотел бы сделать, так это включить модуль в мой контроллер и быть в состоянии использовать класс User моего приложения в том же контроллере.
Я протестировал следующие обходные пути, оба из которых, кажется, работают, и ни один из которых мне не особенно нравится:
- Создайте новую константу для ссылки на мой собственный класс пользователя, прежде чем включать модуль gem.
LocalUser = User
include GemName::Module
Не включайте модуль и явно вызывайте любые классы, которые мне могут понадобиться, с помощью вызова с полным пространством имен.
GemName::Module::Class.method
Я понимаю, что мог бы создать пространство имен для своего класса User, но это потребовало бы большого количества рефакторингавокруг моей кодовой базы, и я все равно не очень люблю эту идею. Этот контроллер вызывает классы из драгоценного камня около 20 раз, а мой собственный класс пользователя - ровно один раз. Контроллер никогда не вызывает класс пользователя самоцвета. Если возможно, я бы хотел, чтобы вызов моего собственного класса User явно ссылался на мой класс без пространства имен и оставлял включение в модуль gem.
Надеюсь, есть элегантное решение, которое увеличит мойпонимание пространств имен в Ruby