【问题标题】:Namespace issue between class in project and gem项目中的类和gem之间的命名空间问题
【发布时间】:2016-09-11 00:25:24
【问题描述】:

所以,我遇到了一个有趣的问题。在我的项目中,我有一个名为“Builder”的类。我们多年来一直在运行这个应用程序,最近我们意识到我们需要Twilio。这需要 Builder gem (https://github.com/jimweirich/builder)。我遇到的问题是名称被覆盖。我可以做些什么来确保我可以使用 twilio 并继续我的构建器课程?这个命名空间噩梦的阻力最小的路径是什么?

【问题讨论】:

  • 您的 Builder 构建了什么?我将通过将其重命名为 SomethingBuilder 的简单过程来解决此问题。例如,如果它构建应用程序,我会将其命名为 AppBuilder 并继续我的项目。
  • 您的项目的类都应该在与您的项目同名的模块下命名,例如如果您的项目名为 Foo,您将拥有 Foo::Builder。

标签: ruby-on-rails ruby namespaces rubygems twilio


【解决方案1】:

避免命名空间冲突的常用方法是使用自己的命名空间:

module MyApp
  class Builder
  end
end

这基本上就是所有有价值的 ruby​​ gem 的编写方式,因为它使互操作性成为可能。在您的 rails 应用程序的 /lib 目录中的命名空间内容非常轻松。但是为所有控制器、模型等命名空间并不那么令人愉快。它杀死了“它只是工作”的轨道魔法的很大一部分。

显式命名空间的东西,例如:

namespace :api do
  namespace :v1 do
    resources :things
  end
end

非常简单。然而,透明的命名空间相当棘手 - 将代码放在模块中而不显着改变路由、路径帮助器或数据库表名。

您可以使用以下方式命名控制器:

scope module: 'my_app' do
  resources :things
end

这将路由到MyApp::ThingsController 而不会影响路径或助手。你可以把控制器放在app/controllers/my_app/things_controller.rb

【讨论】:

  • 你建议我在哪里改变这个?在哪个文件中?
  • 因为我需要做一个应用程序范围的命名空间,它看起来。所有控制器,所有型号,一切。可悲的是,当它被开发时,并没有预见到这一点。但我需要尽可能少地更改内部代码。在游戏中大修和修复一切都为时已晚,而且我不是该项目的所有者。
  • 也许您需要的只是命名 Builder 类 - 在这种情况下,您将添加一个包装该类的模块并将其移动到 /lib/my_app/builder.rb
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多