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