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

迄今为止的故事:

我有一个名为“Term”的模型的Rails应用程序。 一切都很好,直到试图安装黄瓜。 运行时

rake cucumber

我明白了

Term is not a class (TypeError)

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

不喜欢重新命名模型,我开始修补术语 - 安色宝石。 这比我想象的要难得多。 我将术语模块名称改为“ANSITerm”,但我无法弄清楚如何让Cucumber加载我已修改的RAmS_ROOT / vendor / gems / term-ansicolor中的gem。

有任何想法吗? 我吠叫错了树吗?


两种解决方案

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

2)补丁term-ansicolor有一个命名空间的术语,并使用该gem代替。


以下是我所做的:

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 term-ansicolor
sudo gem install cucumber从我的本地存储库sudo gem install cucumber

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

意见/建议表示欢迎。


我的规格中确实遇到了与我的应用程序模型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
链接地址: http://www.djcxy.com/p/38741.html

上一篇: How to resolve Rails model namespace collision

下一篇: Selenium w/ Ruby timing out when trying http operations