1

这个问题的标题可能需要重命名。有什么建议么?

在我的 Rails 应用程序中,/lib 文件夹中有一个名为 foo_blaster.rb 的旧模块。然后我安装了名为 foo_blaster.rb 的 gem。在我删除原始 FooBlaster 模块之前,gem 中的任何代码都不会执行。为什么是这样?Ruby 不应该结合这两个模块吗?

模块是一样的

# lib/foo_blaster.rb
module FooBlaster
  class Characters
    puts "some characters"
  end
end

# foo_blaster gem files
module FooBlaster
   class Users
   end
end

FooBlaster::Characters #=> some characters
FooBlaster::Users #=> NameError: uninitialized constant FooBlaster::Users

我在这里想念什么?

导轨 2.3.18,Ruby 1.8.7-p358

4

2 回答 2

4

如果您打开控制台(使用script/console)并检查$LOAD_PATH变量,您应该会看到类似以下内容:

>> $LOAD_PATH
[
  # some entries...
  [12] "/your/rails/root/app",
  [13] "/your/rails/root/app/controllers",
  [14] "/your/rails/root/app/models",
  [15] "/your/rails/root/app/helpers",
  [16] "/your/rails/root/lib",
  # more entries...
  [27] "/your/ruby/path/lib/ruby/1.8/gems/foo_blaster-0.0.1/lib"
  # rest of entries
]

当您require 'foo_blaster'(可能由 Rails、Bundler 或其他方式隐式完成)时,Ruby 会$LOAD_PATH按顺序搜索位置,直到找到文件 foo_blaster.rb,加载该文件并停止。在您的情况下,它会在您的应用程序的 /lib 目录中找到该文件。永远不会加载您的 gem 中的文件。

如果您想同时加载这两个文件,您所要做的就是给它们起不同的名称并确保require它们都具有。例如,您可以将应用程序中的文件重命名为 foo_blaster_extensions.rb,然后添加一个初始化程序来加载它:

# config/initializers/extend_foo_blaster.rb
require 'foo_blaster_extensions'
于 2013-05-17T19:37:23.633 回答
0

如果您的核心应用程序中需要同名文件。您应该在创建 gem 时遵循最佳实践,即,您应该命名您的 gem。因此,在这种情况下,核心应用程序不会发生冲突。

于 2016-07-19T11:23:30.493 回答