Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 命名空间模块和Rails 3.1.3自动加载路径_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 命名空间模块和Rails 3.1.3自动加载路径

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["#

我在命名模型中包含的模块时遇到了一些问题

在/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
直接放在我定义
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方法时,您应该指定作用域,以消除歧义。嘿,谢谢您的评论。我也这么认为,但似乎不起作用。知道我为什么会出错吗?