Ruby on rails 无法加载库目录模块-未初始化常量-rails 2到rails 3升级

Ruby on rails 无法加载库目录模块-未初始化常量-rails 2到rails 3升级,ruby-on-rails,ruby,ruby-on-rails-3.1,routes,upgrade,Ruby On Rails,Ruby,Ruby On Rails 3.1,Routes,Upgrade,我目前正在将rails v2中的一个应用程序迁移到v3 在我的lib/中,我在子目录中有一些模块,例如, 我有lib/search/host\u search.rb 带着 module HostSearch def do_search(args) #... end end 然后我需要在名为Discovery::HostController

我目前正在将rails v2中的一个应用程序迁移到v3

在我的
lib/
中,我在子目录中有一些模块,例如, 我有
lib/search/host\u search.rb

带着

  module HostSearch
    def do_search(args)
       #...
    end
  end
然后我需要在名为
Discovery::HostController

def search_results
   output = HostSearch.do_search(:search_string => @search_string, 
     :page => params[:page],
     :user => @current_user)
   #...
end
但我得到了:

uninitialized constant Discovery::HostController::HostSearch
…我试着将这行代码放到application.rb中,但它不起作用

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

我发现,在您的情况下,将模块移动到lib文件夹或显式地包含要加载的文件夹是有效的 config.autoload_路径+=%W(#{config.root}/lib/search)


我想我们缺少了一些通灵的东西。另一件事是,如果你不想弄乱application.rb文件,需要这个文件,如果我记得的话,它会从lib文件夹中获取文件路径,例如:search/host\u search我认为如果你把
HostSearch
模块放在一个搜索子目录下(即
lib/search/host\u search.rb
),那么你需要为它命名名称:

module Search
  module HostSearch
  end
end
如果不想为其命名,可以将文件移动到lib根目录中:
lib/host\u search.rb

另见: