命名空间模块和Rails 3.1.3自动加载

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

在/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 ,我定义了Search

module Search
  # Put shared methods here
end

我究竟做错了什么?

更新:

好吧,事实证明,如果我将Search::Car重新命名为Search::CarSearch它就可以工作。 是不可能在不同的范围内有相同名称的模块/类?


该错误来自您的autoload_paths。 config.autoload_paths += Dir["#{config.root}/lib/**/"]将在lib目录下添加所有目录及其子目录。 这意味着你在告诉rails自动加载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/*"]

链接地址: http://www.djcxy.com/p/57543.html

上一篇: Namespaced modules and Rails 3.1.3 autoload

下一篇: html multi language display language names originally