2009-08-03 141 views
58

从Rails 2.3开始,将目录添加到加载路径的正确方法是什么,以便它能够挂钩到Rails的自动重新加载机制中?将目录添加到Rails中的加载路径?

我在想的是一个具有几个使用STI的子类的类,我认为将它们放在一个子目录中而不是混乱的顶层是一个好主意。所以,我有这样的事情:

#app/models/widget.rb 
class Widget < ActiveRecord::Base 
    add_to_load_path File.join(File.dirname(__FILE__), "widgets") 
end 

#app/models/widgets/bar_widget.rb 
class BarWidget < Widget 
end 

#app/models/widgets/foo_widget.rb 
class FooWidget < Widget 
end 

这是add_to_load_path的方法,我要找的。

回答

60

对于较旧版本的Rails

你可以在你的environment.rb配置文件做到这一点。

config.load_paths << "#{RAILS_ROOT}/app/widgets" 

-

对于的Rails 3,看到答案娄

+8

ActiveSupport :: Dependencies.autoload_paths <<“#{RAILS_ROOT}/app/widgets” – 2010-11-21 07:15:16

+1

请参见pocket-full-quarter的答案,这实际上是正确的。这一个现在已经过时了。 – micapam 2013-10-10 02:38:02

1

我发现我所需要的配置后,要做到这一点block--来配置对象进不去了。

# Add additional load paths for your own custom dirs 
# config.load_paths += %W(#{config.root}/extras) 
27

在Rails 3,您可以在配置/ application.rb中,在这个样本是默认提供设置此 - 3.0.0的ActiveSupport:

相反的:

ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets" 

您可能需要这样做:

ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/widgets" 
+13

#config.autoload_paths + =%W(#{config.root} /演员) – tamersalama 2010-11-02 19:05:50

8

钢轨3另一个更新:

这奏效了

ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets" 
+2

Rails.root是必要的导轨3,而不是RAILS_ROOT – 2011-02-16 11:31:31

+0

下滑轨3.0.3,我不得不使用 的ActiveSupport :: Dependencies.autoload_paths + =%W(#{Rails.root.to_s}/app/libs) – 2011-04-29 03:11:48

101

在Rails(3.2.8)的最新版本,这已经在application.rb中的文件发生变化。

代码当前注释为:

# Custom directories with classes and modules you want to be autoloadable. 
    # config.autoload_paths += %W(#{config.root}/extras) 

将需要更新的autoload_paths值。试图修改前load_paths变量会导致此错误。

/configuration.rb:85:in `method_missing': undefined method `load_paths' for #<Rails::Application::Configuration:0xac670b4> (NoMethodError) 

为一个例子,对于每一个路径添加到autoload_paths配置,添加类似于下面的行:

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

config.autoload_paths接受的路径的阵列从该Rails会自动加载常数。 默认为app下的所有目录。

http://guides.rubyonrails.org/configuring.html


从下面的评注(hakunin):

如果该目录下app/,你不需要任何地方添加它,它应该只是默认情况下工作(绝对3.2.12)。 Rails有eager_load_paths,它在开发中充当autoload_paths,并且在生产中急切地加载。 所有app/*目录都会自动添加到那里。

+1

您正在回答一个3岁的问题,并且当问这个问题时rails 3不存在 – Bassetassen 2012-10-10 19:37:51

8

On Rails的5,你需要添加以下代码到environment.rb中:

# Add the widgets folder to the autoload path 
Rails.application.configure do 
    config.autoload_paths << "#{Rails.root}/app/widgets" 
end 
7

Rails的5你不必从应用程序目录中显式地加载文件夹了。放在里面的所有文件夹都可以直接使您不必触摸任何配置文件。但似乎Spring有一些问题。因此

新的工作流程是:

  1. 在命令行上的命令行
  2. 支票上创建/ app目录
  3. 运行spring stop内的新文件夹和类bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'自动加载路径。现在应列出新文件夹。
  4. 在命令行中运行spring start
2

config/application.rb添加config.autoload_path << "#{config.root}/dir/widgets"

文件应该是这样的:

module MyApp 
    class Application < Rails::Application 
    config.autoload_paths << "config.root}/widgets" 
    end 
end 

我知道这个工程的轨道4和5可能其他人也。