在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程是:
- 在/ app目录中创build一个新的文件夹和类
- 在命令行上运行
spring stop
- 用
bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'
检查自动加载pathbin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'
在命令行中bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'
。 现在应列出新的文件夹。 - 在命令行上运行
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"