Как я могу избавиться от неоднозначности своего собственного класса от класса драгоценного камня - PullRequest
2 голосов
/ 25 октября 2019

У меня есть проект Rails, над которым я работаю некоторое время. Как и во многих проектах Rails, у меня есть класс User. В одном из моих контроллеров мне нужно получить доступ к некоторым методам из драгоценного камня, который я использую. Пример кода из драгоценного камня демонстрирует использование включения в конкретный модуль драгоценного камня. Я не собираюсь использовать настоящий драгоценный камень здесь, потому что это не важно для вопроса. У меня нет контроля над этим драгоценным камнем, и мне нужны функциональные возможности от модуля.

include GemName::Module

Проблема в том, что Gem включает свой собственный класс User непосредственно под модулем, который я включил в свой контроллер. Это приводит к вызовам моего собственного класса User к методам, не определенным в пользовательском классе гема:

User.working?(:test_user)

NoMethodError (undefined method `working?' for GemName::Module::User:Class):

Что я хотел бы сделать, так это включить модуль в мой контроллер и быть в состоянии использовать класс User моего приложения в том же контроллере.

Я протестировал следующие обходные пути, оба из которых, кажется, работают, и ни один из которых мне не особенно нравится:

  1. Создайте новую константу для ссылки на мой собственный класс пользователя, прежде чем включать модуль gem.
LocalUser = User
include GemName::Module
Не включайте модуль и явно вызывайте любые классы, которые мне могут понадобиться, с помощью вызова с полным пространством имен.
GemName::Module::Class.method

Я понимаю, что мог бы создать пространство имен для своего класса User, но это потребовало бы большого количества рефакторингавокруг моей кодовой базы, и я все равно не очень люблю эту идею. Этот контроллер вызывает классы из драгоценного камня около 20 раз, а мой собственный класс пользователя - ровно один раз. Контроллер никогда не вызывает класс пользователя самоцвета. Если возможно, я бы хотел, чтобы вызов моего собственного класса User явно ссылался на мой класс без пространства имен и оставлял включение в модуль gem.

Надеюсь, есть элегантное решение, которое увеличит мойпонимание пространств имен в Ruby

1 Ответ

4 голосов
/ 25 октября 2019

Сразу после публикации вопроса я подумал: «Что если я просто объявлю :: перед пользователем при вызове своего собственного класса без пространства имен?»

Конечно, это работает.

::User.working?(:test_user)

Зовет мой собственный класс пользователя.

Я оставляю вопрос и этот ответ на случай, если он поможет другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...