2009-11-15 6 views
9

La storia finora:come risolvere Rails modello dello spazio dei nomi di collisione

Ho un app rotaie con un modello denominato "Term". Tutto va bene fino a quando non tenterai di installare Cucumber. Al momento l'esecuzione

rake cucumber 

ottengo

Term is not a class (TypeError) 

Questo accade perché cetriolo include un altro gioiello, 'termine-ANSIColor' (per fare l'output di testo colorato abile nella console), e la durata-ANSIColor definisce un modulo denominato "Termine". Cucumber include termini ansicolor prima di includere i modelli Rails, quindi "Term" è già definito come modulo durante il caricamento del modello "Term". I moduli e le classi di livello superiore non possono avere lo stesso nome in Ruby, quindi la collisione.

Preferendo non rinominare il modello, ho deciso di applicare il termine gemma ansicolor. Questo si è rivelato più difficile di quanto pensassi. Ho cambiato il nome del modulo Term in "ANSITerm", ma non riesco a capire come ottenere da Cucumber il mio gioiello modificato, che ho inserito in RAILS_ROOT/vendor/gems/term-ansicolor.

Qualche idea? Sto abbaiando dall'albero sbagliato?

+0

Ho appena imbattuto in questo esatto * * problema, ho un modello denominato Term come bene e cetriolo appena installato. Per fortuna ho cercato quell'errore prima di passare ore a cercare di capire cosa stava succedendo! Grazie mille per aver postato questo, seguirò la tua soluzione! – carols10cents

+0

Sono contento che sia stato utile. Tieni presente che devi mantenere aggiornate le tue gemme patchate, quindi rinominare il modello potrebbe essere più semplice. – zetetic

+0

Ho effettivamente commentato questo bug di cetriolo qui: https://rspec.lighthouseapp.com/projects/16211-cucumber/tickets/489 e sto lavorando per ottenere il vostro termine patch-ansicolor da github integrato con un cetriolo rattoppato in modo che non dobbiamo mantenere la gemma rattoppata; ma sì, ho ribattezzato il mio modello nel frattempo. – carols10cents

risposta

3

due soluzioni:

1) Cambio del modello termine della tua app per essere qualcos'altro.

2) Patch-termine ansicolor per avere un termine namespaced e utilizzare invece la gemma.

4

Ecco quello che ho fatto:

sudo gem uninstall term-ansicolor
sudo gem uninstall cucumber

fonti il ​​download di termine-ANSIColor e cetrioli da github
Ricerca sorgente termine-ANSIColor per "module Term" e sostituirlo con "module ANSITerm"
Cerca fonte di cetriolo per "include Term" e sostituire con "include ANSITerm"
Cerca origine cetriolo per "::Term" e sostituirlo con "::ANSITerm"

sudo gem install term-ansicolor dal mio repository locale
sudo gem install cucumber dal mio repository locale

Ora ho due gemme per mantenere, ma che sembra più facile che cambiare tutti i riferimenti modello nella mia app.

Commenti/suggerimenti benvenuto.

+1

solo per FYI, c'è anche Gherkin. Cucumber fa affidamento su Gherkin, Gherkin si affida a Term-Ansicolor. L'idea generale è buona e funzionerà per diverse persone, ma tutti lo faranno ancora ogni volta che dovrà affrontare quella cosa. La cosa migliore sarebbe sistemarla una volta in Cetriolo/Gherkin e dimenticarsene per secoli. – 0100110010101

+0

Non mi piace questa soluzione. In retrospettiva, hai trovato un approccio migliore? Ho avuto problemi simili con "Task", che credo utilizzi Rake, ha dovuto rinominare Taskee. –

2

Ho ottenuto una collisione di namespace con il mio modello di applicazione Nodo e Capybara :: Node nelle mie specifiche. E 'stato sufficiente per me per indicare esplicitamente namespace toplevel in specifiche per risolvere il problema:

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