我在为模型中包含的模块命名空间时遇到了一些麻烦。
在/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
,则可行。
是否不可能在不同的范围内具有相同名称的模块/类?
答案 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/*"]