从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
方法。
答案 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存在一些问题。
因此新的工作流程是:
spring stop
bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'
检查自动加载路径。现在应该列出新文件夹。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 自动加载的示例)