9
votes

Comment résoudre la collision des espaces de noms de modèle

L'histoire jusqu'à présent:

J'ai une application Rails avec un modèle nommé "terme". Tout va bien jusqu'à essayer d'installer du concombre. En cours d'exécution xxx

i get xxx

Ceci arrive parce que le concombre comprend un autre gemme "Terme-Ansicolor" (à faire La sortie de texte de couleur nifty dans la console) et Term-ansicolor définit un module nommé "terme". Le concombre comprend le terme ansicolor avant d'inclure les modèles de rails, il est donc déjà défini comme un module lors du chargement du modèle "Terme". Les modules de haut niveau et les classes ne peuvent pas avoir les mêmes noms dans Ruby, donc la collision.

Préfiguration de ne pas renommer le modèle, je me suis mis sur la correction de la gemme à terme-ansicolor. Cela s'est avéré plus difficile que je pensais. J'ai changé le nom du module à "Ansterm", mais je ne peux pas comprendre comment obtenir le concombre de charger mon gemme modifié, que j'ai mis dans des rails_root / fournisseur / gemmes / Term-ansicolor.

Des idées? Suis-je aboyer le mauvais arbre?


3 commentaires

Je viens de courir dans cette question exacte , j'ai un modèle nommé terme et juste un concombre installé. Bonne chose que j'ai cherché cette erreur avant de passer des heures à essayer de comprendre ce qui se passait! Merci beaucoup d'avoir posté cela, je vais suivre votre solution!


Je suis content que c'était utile. N'oubliez pas que vous devez conserver vos gemmes patchées à l'avenir, alors renommer le modèle pourrait être plus facile.


J'ai réellement commenté ce bogue de concombre ici: rspec.lighthouseApp.com/projects / 16211-Concombre / billets / 489 et je travaille sur votre terme patché-ansicolor de GitHub intégré à un concombre corrigé afin de ne pas avoir à maintenir le gemme corrigé; Mais oui, j'ai renommé mon modèle entre-temps.


3 Réponses :


3
votes

Deux solutions:

1) Modifiez le modèle de terme de votre application pour être autre chose.

2) Patch Term-ansicolor pour avoir un terme payé et utiliser ce joyau à la place.


0 commentaires

4
votes

Voici ce que j'ai fait:

Sudo GEM Désinstallation Term-Ansicolor
Sudo GEM Désinstallez CUCOMBER

Télécharger des sources pour le terme ansicolor et concombre de GitHub
Recherche Term-ansicolor Source pour "Terme Module" et Remplacer par "Module ansterm"
Rechercher Source de concombre pour "Inclure le terme" et remplacer par "inclure ansterm"
Rechercher la source de concombre pour ":: terme" et remplacer par ":: ansterm"

sudo gem installation term-ansicolor de mon référentiel local
sudo gem installer concombre de mon référentiel local

Maintenant, j'ai deux gemmes à maintenir, mais cela semble plus facile que de changer toutes les références de modèle dans mon application.

Commentaires / Suggestions Bienvenue.


2 commentaires

Juste fyi, il y a aussi un hérokine. Le concombre repose sur le gérokin, Gherkin s'appuie sur le terme ansicolor. L'idée globale est bonne et travaillera pour plusieurs personnes, mais tout le monde va toujours faire cette solution de contournement chaque fois qu'il fait face à cette chose. La meilleure chose serait de le réparer une fois dans concombre / gerkin et l'oublier pour les âges.


Je n'aime pas vraiment cette solution. Dans Retrospect, avez-vous trouvé une meilleure approche? J'ai eu des problèmes similaires avec «tâche» que je crois que Rake utilise, devait renommer à Taskee.



3
votes

J'ai obtenu une collision d'espace de noms avec mon modèle de modèle d'application Node et Capybara :: nœud de mes spécifications. Il suffisait d'énoncer explicitement l'espace de nom de Toplevel dans des spécifications pour résoudre le problème:

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


0 commentaires