在Rails中加载一个目录到加载path?

至于Rails 2.3,有什么正确的方法来添加一个目录到加载path,以便它挂钩到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方法。

对于旧版本的Rails:

你可以在你的environment.rbconfiguration文件中做到这一点。

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

对于Rails 3 ,请参阅下面的答案

在当前版本的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_pathsvariables会导致此错误。

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

例如,对于添加到autoload_paths config的每个path,添加一行类似于以下内容的行:

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

config.autoload_paths接受一个Rails自动加载常量的path数组。 默认是app下的所有目录。

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


从下面的评论或者(hakunin)

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

在Rails 3中,你可以在config / application.rb中设置这个默认的样例:

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

rails 3的另一个更新 – activesupport 3.0.0:

代替:

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

您可能需要这样做:

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

在Rails 5上,您需要将以下代码添加到environment.rb中:

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

Rails 5中,您不必从app目录中显式加载文件夹了。 放在里面的所有文件夹都可以直接使 您不必触摸任何configuration文件。 但是好像Spring有一些问题。

新的工作stream程是:

  1. 在/ app目录中创build一个新的文件夹和类
  2. 在命令行上运行spring stop
  3. bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'检查自动加载pathbin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'在命令行中bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths' 。 现在应列出新的文件夹。
  4. 在命令行上运行spring start

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

文件应该是这样的:

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

我知道这适用于Rails 4和5。也可能是其他人。

我发现我需要在configuration块后执行此操作 – 不再访问configuration对象。

这个伎俩

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