Namespaced模块和Rails 3.1.3 autoload_path

时间:2012-02-16 22:25:36

标签: ruby-on-rails ruby

我在为模型中包含的模块命名空间时遇到了一些麻烦。

在/app/models/car.rb

class Car
 include Search::Car
end

在/lib/search/car.rb

module Search
  module Car
    include ActiveSupport::Concern
    # methods in here
  end
end

在/config/application.rb

config.autoload_paths += Dir["#{config.root}/lib/**/"]
config.autoload_paths += Dir["#{config.root}/lib/search/*"]

奇怪的是,当我启动服务器时,我没有直接得到任何错误。 但是如果我在一段时间后刷新浏览器,我会收到此错误:

Expected #{Rails.root}/lib/search/car.rb to define Car

问题的本质表明它与某些事情有关:

/config/environments/development.rb

config.cache_classes = false

我还尝试将文件search.rb直接放在我定义/lib的{​​{1}}中:

Search

我做错了什么?

更新:

好的,事实证明,如果我将module Search # Put shared methods here end 重命名为Search::Car,则可行。 是否不可能在不同的范围内具有相同名称的模块/类?

1 个答案:

答案 0 :(得分:4)

错误来自您的autoload_paths。 config.autoload_paths += Dir["#{config.root}/lib/**/"]将在lib目录下添加所有目录及其子目录。这意味着你告诉自动加载lib / search /目录,因此该目录下的car.rb应该定义Car而不是Search :: Car。为了让rails期望lib / search / car.rb定义Search :: Car,你需要自动加载lib /目录而不是lib / search。如果您将自动加载更改为config.autoload_paths += Dir["#{config.root}/lib/"]并将search.rb放在lib /中,则使用以下代码:

module Search
  require 'search/car'
end

然后rails会理解并期望lib / search / car.rb定义Search :: Car并在代码的其他地方引用Car模块/类将不会引用此car.rb。

你应该删除这一行(你应该只有lib目录的自动加载): config.autoload_paths += Dir["#{config.root}/lib/search/*"]