命名空间模块和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/*"]