【问题标题】:How to resolve Rails model namespace collision如何解决 Rails 模型命名空间冲突
【发布时间】:2010-12-16 17:50:18
【问题描述】:

到目前为止的故事:

我有一个名为“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。

有什么想法吗?我是不是找错树了?

【问题讨论】:

  • 我刚刚遇到了这个 exact 问题,我也有一个名为 Term 的模型,并且刚刚安装了 cucumber。幸好我在花了几个小时试图弄清楚发生了什么之前搜索了那个错误!非常感谢您发布此内容,我会关注您的解决方案!
  • 我很高兴这对您有所帮助。请记住,您必须继续维护已修补的 gem,因此重命名模型可能会更容易。
  • 我实际上已经在这里评论了这个黄瓜错误:rspec.lighthouseapp.com/projects/16211-cucumber/tickets/489 我正在努力从 github 获取您的补丁 term-ansicolor 与补丁黄瓜集成,这样我们就不必维护修补的宝石;但是,是的,我同时重命名了我的模型。

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


【解决方案1】:

在我的规范中,我的应用程序模型 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

【讨论】:

    【解决方案2】:

    这就是我所做的:

    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 来自我的本地存储库

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

    欢迎评论/建议。

    【讨论】:

    • 仅供参考,还有小黄瓜。 Cucumber 依赖 Gherkin,Gherkin 依赖 Term-Ansicolor。总体想法很好,并且适用于几个人,但每个人每次面对那件事时仍然会这样做。更好的办法是在 Cucumber/Gherkin 中修复一次,然后忘记它很长时间。
    • 我不太喜欢这个解决方案。回想起来,你有没有找到更好的方法?我相信 Rake 使用的“任务”也有类似的问题,不得不重命名为 Taskee。
    【解决方案3】:

    两种解决方案:

    1) 将应用的 Term 模型更改为其他模型。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-10
      • 2011-01-31
      • 1970-01-01
      • 2016-02-20
      • 2023-03-11
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      相关资源
      最近更新 更多