Ruby on rails 命名空间模块和Rails 3.1.3自动加载路径
我在命名模型中包含的模块时遇到了一些问题 在/app/models/car.rb中Ruby on rails 命名空间模块和Rails 3.1.3自动加载路径,ruby-on-rails,ruby,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["#
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
直接放在我定义search
的/lib
中:
module Search
# Put shared methods here
end
我做错了什么
更新:
好的,如果我将Search::Car
重命名为Search::CarSearch
它就可以工作了。
无法在不同的作用域中使用相同名称的模块/类吗?错误来自自动加载路径
config.autoload_path+=Dir[“#{config.root}/lib/**/”]
将在lib目录下添加所有目录及其子目录。这意味着您要告诉rails自动加载lib/search/directory,因此该目录下的car.rb应该定义car,而不是search::car。为了让rails期望lib/search/car.rb定义search::car,您需要自动加载lib/directory,而不是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/*”]
您可以在不同的作用域中使用相同名称的模块/类,但是当您使用模块Car方法时,您应该指定作用域,以消除歧义。嘿,谢谢您的评论。我也这么认为,但似乎不起作用。知道我为什么会出错吗?