9

到目前为止的故事:

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

rake cucumber

我明白了

Term is not a class (TypeError)

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

不想重命名模型,我着手修补术语 ansicolor gem。事实证明这比我想象的要难。我将 Term 模块名称更改为“ANSITerm”,但我不知道如何让 Cucumber 加载我已将其放入 RAILS_ROOT/vendor/gems/term-ansicolor 的修改后的 gem。

有任何想法吗?我在吠叫错误的树吗?

4

3 回答 3

4

这是我所做的:

sudo gem uninstall term-ansicolor
sudo gem uninstall cucumber

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

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

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

欢迎评论/建议。

于 2009-11-16T03:50:57.200 回答
3

两种解决方案:

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

2) 修补 term-ansicolor 以具有命名空间 Term 并改用该 gem。

于 2009-11-15T06:45:01.433 回答
3

在我的规范中,我确实与我的应用程序模型 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
于 2010-11-17T19:52:04.290 回答