代码之家  ›  专栏  ›  技术社区  ›  zetetic

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

  •  9
  • zetetic  · 技术社区  · 16 年前

    到目前为止的故事:

    我有一个名为“Term”的rails应用程序。在尝试安装Cucumber之前,一切正常。跑步时

    rake cucumber
    

    Term is not a class (TypeError)
    

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

    我不想重命名这个模型,而是着手修补ansicolor gem这个术语。这比我想象的要难。我将术语模块名改为“ANSITerm”,但我不知道如何让Cucumber加载修改后的gem,我已将其放入RAILS\u ROOT/vendor/gems/Term ansicolor中。

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

    3 回复  |  直到 16 年前
        1
  •  3
  •   Ryan Bigg Andrés Bonilla    16 年前

    两种解决方案:

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

    2) 修补术语ansicolor,使其具有名称空间术语,并改用该gem。

        2
  •  4
  •   zetetic    16 年前

    以下是我所做的:

    sudo gem uninstall term-ansicolor
    sudo gem uninstall cucumber

    从github下载术语ansicolor和cucumber的源代码
    "module Term" 并替换为 "module ANSITerm"
    寻找黄瓜的来源 "include Term" "include ANSITerm"
    "::Term" 并替换为 "::ANSITerm"

    sudo gem install term-ansicolor
    sudo gem install cucumber

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

        3
  •  3
  •   dimus    15 年前

    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
    
    推荐文章