2009-11-15 5 views
9

L'histoire jusqu'à présent:Comment résoudre namespace modèle Rails collision

J'ai une application rails avec un modèle nommé « terme ». Tout va bien jusqu'à essayer d'installer le concombre. Lors de l'exécution

rake cucumber 

Je reçois

Term is not a class (TypeError) 

Cela se produit parce que le concombre comprend un petit bijou, «terme-ANSIColor (à faire la sortie de texte nifty de couleur dans la console), et la durée-ANSIColor définit une module nommé "Terme". Le concombre inclut term-ansicolor avant d'inclure les modèles Rails, ainsi "Term" est déjà défini comme un module lors du chargement du modèle "Term". Les modules et classes de niveau supérieur ne peuvent pas avoir les mêmes noms dans Ruby, donc la collision. Préférant ne pas renommer le modèle, j'ai commencé à patcher la gemme term-ansicolor. Cela s'est avéré plus dur que je ne le pensais. J'ai changé le nom du module de terme en "ANSITerm", mais je ne peux pas comprendre comment obtenir le concombre pour charger mon gem modifié, que j'ai mis dans RAILS_ROOT/vendor/gems/term-ansicolor.

Des idées? Est-ce que j'aboie le mauvais arbre?

+0

Je viens de croiser ce * * exact problème, j'ai un modèle nommé terme aussi bien et le concombre vient d'être installé. C'est une bonne chose que j'ai cherché cette erreur avant de passer des heures à essayer de comprendre ce qui se passait! Merci beaucoup de poster ceci, je suivrai votre solution! – carols10cents

+0

Je suis content que ce fut utile. Gardez à l'esprit que vous devez maintenir vos gemmes corrigées à l'avenir, donc renommer le modèle pourrait être plus facile. – zetetic

+0

J'ai effectivement commenté ce bug de concombre ici: https://rspec.lighthouseapp.com/projects/16211-cucumber/tickets/489 et je travaille pour obtenir votre terme-ansicolor patché de github intégré avec un concombre patché de sorte que nous ne devons pas maintenir la gemme patchée; mais oui, j'ai renommé mon modèle en attendant. – carols10cents

Répondre

3

Deux solutions:

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

2) Patch terme-ansicolor pour avoir un terme namespaced et utiliser ce gem à la place.

4

Voici ce que je l'ai fait:

sudo gem uninstall term-ansicolor
sudo gem uninstall cucumber

sources de téléchargement pour le mot-ANSIColor et le concombre de github
terme source-ANSIColor Recherche pour "module Term" et les remplacer par "module ANSITerm"
Rechercher source de concombre pour "include Term" et remplacer par "include ANSITerm"
Rechercher concombre source pour "::Term" et le remplacer par "::ANSITerm"

sudo gem install term-ansicolor de mon dépôt local
sudo gem install cucumber de mon dépôt local

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

Commentaires/suggestions bienvenus.

+1

juste pour info, il y a aussi Gherkin. Le concombre repose sur Gherkin, Gherkin s'appuie sur Term-Ansicolor. L'idée générale est bonne, et cela fonctionnera pour plusieurs personnes, mais tout le monde fera toujours ce contournement chaque fois qu'il affrontera cette chose. La meilleure chose serait de le fixer une fois dans Concombre/Gherkin et l'oublier pour les âges. – 0100110010101

+0

Je n'aime pas vraiment cette solution. Rétrospectivement, avez-vous trouvé une meilleure approche? J'ai eu des problèmes similaires avec 'Task' que je crois que Rake utilise, a dû renommer en Taskee. –

2

J'ai obtenu une collision d'espace de noms avec mon modèle d'application Node et Capybara :: Node dans mes spécifications. Il me suffisait d'indiquer explicitement l'espace de noms de premier niveau dans les specs 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