2009-11-15 57 views
9

迄今爲止的故事:如何解決Rails的模型命名空間衝突

我有一個名爲「期限」模型中的Rails應用程序。一切都很好,直到試圖安裝黃瓜。在運行

rake cucumber 

我得到

Term is not a class (TypeError) 

這是因爲黃瓜包括另一顆寶石,「長期-ansicolor」(做在控制檯中漂亮的彩色文本輸出),以及長期-ansicolor定義名爲「Term」的模塊。在包含Rails模型之前,Cucumber包含term-ansicolor,因此在加載「Term」模型時,「Term」已被定義爲模塊。頂級模塊和類不能在Ruby中具有相同的名稱,因此碰撞。

不喜歡重命名模型,我設置了修補term-ansicolor gem。這比我想象的要難得多。我將術語模塊名稱改爲「ANSITerm」,但我無法弄清楚如何讓Cucumber加載我修改過的gem,我已將它放入RAILS_ROOT/vendor/gems/term-ansicolor。

任何想法?我吠叫錯了樹嗎?

+0

我只是碰到了這個確切* *的問題,我也一樣的模型命名期限和剛剛安裝黃瓜。在花費數小時試圖弄清楚發生了什麼事之前,我搜索了這個錯誤是件好事!非常感謝您發佈此信息,我將會遵循您的解決方案! – carols10cents 2010-01-21 21:24:33

+0

我很高興這是有幫助的。請記住,你必須保持你的補丁寶石前進,所以重命名模型可能會更容易。 – zetetic 2010-01-22 16:34:52

+0

我實際上在這裏評論了這個黃瓜缺陷:https://rspec.lighthouseapp.com/projects/16211-cucumber/tickets/489,我正在從github獲得補丁項 - ansicolor,並與修補過的黃瓜所以我們不必保持修補的寶石;但是,是的,我在此期間重新命名了我的模型。 – carols10cents 2010-02-01 14:53:50

回答

3

兩個解決方案:

1)改變你的應用程序的期限模型是別的東西。

2)補丁term-ansicolor有一個命名空間的術語並使用該gem代替。

4

這裏就是我所做的:

sudo gem uninstall term-ansicolor
sudo gem uninstall cucumber

下載源項,ansicolor和黃瓜從GitHub
搜索字詞,ansicolor源"module Term""module ANSITerm"
搜索黃瓜源替代"include Term"並替換爲"include ANSITerm"
搜索黃瓜來源"::Term""::ANSITerm"

sudo gem install term-ansicolor從我的本地庫從我的本地庫

更換
sudo gem install cucumber現在我有兩個寶石來維持,但似乎比我的應用程序改變的所有模型引用更容易。

意見/建議表示歡迎。

+1

只是FYI,還有小黃瓜。黃瓜依靠小黃瓜,小黃瓜依賴於Term-Ansicolor。總體思路是好的,並且會爲幾個人工作,但每當他面對那件事時,每個人都會繼續這樣做。更好的辦法是在黃瓜/小黃瓜中修復一次,並忘記它很久。 – 0100110010101 2010-08-20 14:54:59

+0

我不太喜歡這個解決方案。回想起來,你有沒有找到更好的方法?我遇到類似的問題,我認爲Rake使用的'Task'必須重命名爲Taskee。 – 2013-03-12 22:48:54

2

我的規格中確實遇到了與我的應用程序模型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