Как разрешить коллизию пространства имен модели Rails - PullRequest
9 голосов
/ 15 ноября 2009

История до сих пор:

У меня есть приложение rails с моделью "Term". Все хорошо, пока не попробую установить огурец. После запуска

rake cucumber

Я получаю

Term is not a class (TypeError)

Это происходит потому, что Cucumber включает в себя еще один гем - term-ansicolor (для вывода изящного цветного текста в консоли), а term-ansicolor определяет модуль с именем «Term». Cucumber включает термин «ansicolor» перед включением моделей Rails, поэтому «термин» уже определен как модуль при загрузке модели «термин». Модули и классы верхнего уровня не могут иметь одинаковые имена в Ruby, таким образом, коллизия.

Предпочитая не переименовывать модель, я приступил к исправлению самоцвета term-ansicolor. Это оказалось сложнее, чем я думал. Я изменил имя модуля Term на «ANSITerm», но не могу понять, как заставить Cucumber загрузить мой модифицированный гем, который я поместил в RAILS_ROOT / vendor / gems / term-ansicolor.

Есть идеи? Я лаю не на том дереве?

Ответы [ 3 ]

4 голосов
/ 16 ноября 2009

Вот что я сделал:

sudo gem uninstall term-ansicolor
sudo gem uninstall cucumber

Скачать исходники терминов-анциколоров и огурцов с github
Поищите термин «анзиколор» для "module Term" и замените на "module ANSITerm"
Найдите источник огурца по "include Term" и замените на "include ANSITerm"
Найдите источник огурца по "::Term" и замените на "::ANSITerm"

sudo gem install term-ansicolor из моего локального хранилища
sudo gem install cucumber из моего локального хранилища

Теперь у меня есть два драгоценных камня для обслуживания, но это кажется проще, чем изменять все ссылки на модели в моем приложении.

Комментарии / предложения приветствуются.

3 голосов
/ 15 ноября 2009

Два решения:

1) Измените модель термина вашего приложения на что-то другое.

2) Исправьте термин-ansicolor, чтобы иметь Термин в пространстве имен, и используйте вместо этого этот камень.

2 голосов
/ 17 ноября 2010

Я получил столкновение пространства имен с моими моделями приложений Node и Capybara :: Node в моих спецификациях. Для решения проблемы мне было достаточно явно указать пространство имен верхнего уровня в спецификациях:

it "should find the specified node scoped under the current user" do
  ::Node.should have_received(:find_by_id_for_user).with(node.id, user)
end
...