如何在rails app的root下自动加载文件夹中的文件

时间:2012-02-24 11:37:38

标签: ruby-on-rails-3 autoloader

我正在尝试将文件放在myapplication/somefolder下。 Google和Stackoverflow说我应该补充一下:

config.autoload_paths += %W(#{config.root}/somefolder)

在我config/application.rb中,所以我做到了。

但文件没有加载。

我尝试了somefolder/myclass.rb class Myclassclass Somefolder::Myclass,但仍然没有运气。

我可以看到在控制台Rails.application.config.autoload_paths中找到的dir确实包含了我的/path/to/myapplication/somefolder目录,所以应该没问题。

围绕此主题的所有其他问题都使用theapp/app/somefoldertheapp/lib/somefolder,但不使用theapp/somefolder,所以也许这会使它变得腐烂。

因此,我尝试使用::Somefolder::MyClass引用该类,但甚至没有帮助。

我正在使用Rails 3.2.1

3 个答案:

答案 0 :(得分:2)

今天我自己也遇到了这个问题并决定深入研究。

您未在ActiveSupport::Dependencies.autoload_paths中看到config.autoload_pathsconfig/application.rb添加rails/engine.rb的路径的原因是,他们不会被复制到应用程序已初始化。请参阅railties gem中的module Rails class Engine < Railtie … # Set the paths from which Rails will automatically load source files, # and the load_once paths. # # This needs to be an initializer, since it needs to run once # per engine and get the engine as a block parameter initializer :set_autoload_paths, :before => :bootstrap_hook do |app| ActiveSupport::Dependencies.autoload_paths.unshift(*_all_autoload_paths) ActiveSupport::Dependencies.autoload_once_paths.unshift(*_all_autoload_once_paths) # Freeze so future modifications will fail rather than do nothing mysteriously config.autoload_paths.freeze config.eager_load_paths.freeze config.autoload_once_paths.freeze end … def _all_autoload_paths @_all_autoload_paths ||= (config.autoload_paths + config.eager_load_paths + config.autoload_once_paths).uniq end … end end

MyClass

您是否有机会尝试从config/application.rb内部调用config/application.rb,或者甚至更早,从需要MyClass的脚本或模块调用require File.expand_path('../../somefolder/my_class', __FILE__) # now use MyClass ?如果是这样,您必须明确要求定义{{1}}的文件,例如:

{{1}}

答案 1 :(得分:1)

解决方法是直接转到ActiveSupport::Dependencies.autoload_paths

ActiveSupport::Dependencies.autoload_paths << "#{config.root}/somefolder"

但是我仍然在寻找config.autoload_paths无效的原因,所以如果你发布一个aswer,我会接受它!

答案 2 :(得分:1)

您应该为somefolder/my_class.rb命名,以便自动加载MyClass。您还应该在config.autoload_paths += %W(#{config.root}/somefolder)中保留config/application.rb行。