在Rails中将目录添加到加载路径?

时间:2009-08-03 17:11:59

标签: ruby-on-rails ruby

从Rails 2.3开始,将一个目录添加到加载路径以便它挂钩到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方法。

9 个答案:

答案 0 :(得分:107)

在当前版本的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 :(得分:60)

对于旧版本的Rails:

您可以在environment.rb配置文件中执行此操作。

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

-

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

答案 2 :(得分:27)

在Rails 3中,您可以在config / application.rb中设置它,默认情况下提供此示例:

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

答案 3 :(得分:19)

Rails 5 中,您不必再在app目录中显式加载文件夹。放在里面的所有文件夹都可直接使用您不必触摸任何配置文件。但似乎Spring存在一些问题。

因此新的工作流程是:

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

答案 4 :(得分:10)

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

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

答案 5 :(得分:8)

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

而不是:

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

您可能需要这样做:

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

答案 6 :(得分:1)

我发现我需要在配置阻止之后执行此操作 - 不再访问配置对象。

这就是诀窍

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

答案 7 :(得分:1)

config/application.rb添加config.autoload_paths << "#{config.root}/models/widgets"

文件应如下所示:

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

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

答案 8 :(得分:0)

如果要添加多个目录:

config.autoload_paths += Dir[Rails.root / "components/*/app/public"]

(这是 packwerk 自动加载的示例)