如何解决Rails模型命名空间冲突

时间:2009-11-15 06:08:16

标签: ruby-on-rails ruby namespaces cucumber collision

到目前为止的故事:

我有一个名为“Term”的模型的rails应用程序。一切都很顺利,直到尝试安装Cucumber。运行时

rake cucumber

我得到了

Term is not a class (TypeError)

这是因为Cucumber包含另一个gem,'term-ansicolor'(在控制台中执行漂亮的彩色文本输出),而term-ansicolor定义了一个名为“Term”的模块。在包含Rails模型之前,Cucumber包括term-ansicolor,因此在加载“Term”模型时,“Term”已被定义为模块。顶级模块和类在Ruby中不能具有相同的名称,因此发生冲突。

不想重命名模型,我开始修补term-ansicolor gem。事实证明这比我想象的更难。我将Term模块名称更改为“ANSITerm”,但我无法弄清楚如何让Cucumber加载我修改过的gem,我已将其放入RAILS_ROOT / vendor / gems / term-ansicolor。

有什么想法吗?我吠叫错了树吗?

3 个答案:

答案 0 :(得分:4)

这就是我的所作所为:

sudo gem uninstall term-ansicolor
sudo gem uninstall cucumber

从github下载term-ansicolor和cucumber的来源 搜索"module Term"的term-ansicolor源代码并替换为"module ANSITerm"
搜索"include Term"的黄瓜来源并替换为"include ANSITerm"
搜索"::Term"的黄瓜来源并替换为"::ANSITerm"

来自我本地存储库的

sudo gem install term-ansicolor
来自我的本地存储库的sudo gem install cucumber

现在我有两个宝石要维护,但这似乎比我应用程序中更改所有模型引用更容易。

欢迎评论/建议。

答案 1 :(得分:3)

两种解决方案:

1)将您应用的期限模型更改为其他内容。

2)Patch term-ansicolor具有命名空间Term并改为使用该gem。

答案 2 :(得分: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