如何解决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