2009-11-15 15 views
9

Dotychczasowa historia:Jak rozwiązać kolizję przestrzeni nazw modelu szyny

Mam aplikację szyny z modelem o nazwie "Term". Wszystko dobrze, dopóki nie spróbujesz zainstalować ogórka. Po uruchomieniu

rake cucumber 

uzyskać

Term is not a class (TypeError) 

Dzieje się tak dlatego, ogórek zawiera inny klejnot, 'Term-ansicolor' (zrobić fajną kolorową wyjście tekstu w konsoli), a termin-ansicolor definiuje moduł o nazwie "Term". Ogórek zawiera termin-ansicolor przed włączeniem modeli Rails, dlatego "Term" jest już zdefiniowany jako moduł podczas ładowania modelu "Term". Najwyższego poziomu moduły i klasy nie mogą mieć tych samych nazw w Ruby, a więc kolizji.

Nie chcąc zmienić nazwy modelu, ustawiam łatanie klejnotu term-ansicolor. To okazało się trudniejsze, niż myślałem. Zmieniłem nazwę modułu Term na "ANSITerm", ale nie mogę wymyślić, jak uzyskać Cucumber, aby załadował zmodyfikowany klejnot, który umieściłem w RAILS_ROOT/vendor/gems/term-ansicolor.

Wszelkie pomysły? Czy szczerzę złe drzewo?

+0

po prostu wpadł na ten dokładny * * problem, mam model nazwany Term, jak również i po prostu zainstalowany ogórka. Dobrze, że szukałem tego błędu, zanim spędziłem godziny próbując dowiedzieć się, co się dzieje! Dziękuję bardzo za opublikowanie tego, będę podążał za twoim rozwiązaniem! – carols10cents

+0

Cieszę się, że to było pomocne. Pamiętaj, że musisz utrzymywać łatane klejnoty do przodu, więc zmiana nazwy modelu może być łatwiejsza. – zetetic

+0

Naprawdę skomentowałem ten błąd z ogórkiem tutaj: https://rspec.lighthouseapp.com/projects/16211-cucumber/tickets/489 i pracuję nad otrzymaniem poprawionego terminu-ansicolor z github zintegrowanego z poprawionym ogórkiem abyśmy nie musieli utrzymywać łatanego klejnotu; ale tak, zmieniłem nazwę mojego modelu w międzyczasie. – carols10cents

Odpowiedz

3

dwa rozwiązania:

1) Zmiana modelu Term swojej aplikacji musi być coś innego.

2) Łatka term-ansicolor, aby mieć termin z określonymi imionami i używać tego klejnotu.

4

Oto co zrobiłem:

sudo gem uninstall term-ansicolor
sudo gem uninstall cucumber

źródła pobierania dla semestru ansicolor i ogórka z github
Search źródła termin-ansicolor dla "module Term" i zastąpić "module ANSITerm"
Search źródła ogórkowym dla "include Term" i zamień na "include ANSITerm"
Wyszukaj źródło ogórków na "::Term" i zastąpić "::ANSITerm"

sudo gem install term-ansicolor z moim lokalnym repozytorium
sudo gem install cucumber z moim lokalnym repozytorium

Teraz mam dwa kamienie, aby utrzymać, ale to wydaje się łatwiejsze niż zmiana wszelkie odniesienia modelu w moim app.

Komentarze/sugestie są mile widziane.

+1

Po prostu FYI, jest też Korniszon. Ogórek opiera się na korniszonie, korniszon polega na Term-Ansicolor. Ogólny pomysł jest dobry i będzie działać dla kilku osób, ale każdy będzie nadal robił to obejście za każdym razem, gdy stanie przed tym. Lepiej byłoby naprawić go raz w ogórkach i zapomnieć o nim od wieków. – 0100110010101

+0

Nie podoba mi się to rozwiązanie. Z perspektywy czasu znalazłeś lepsze podejście? Miałem podobne problemy z zadaniem, które, jak sądzę, używa Rake, musiały zmienić nazwę na Taskee. –

2

W mojej specyfikacji wystąpiły kolizje przestrzeni nazw z moim modelem aplikacji Node i Capybara :: Node. To było dla mnie wystarczające, aby jednoznacznie stwierdzić nazw Toplevel w specyfikacji, aby rozwiązać problem:

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 
Powiązane problemy