pjb*_*jb3 64 ruby ruby-on-rails
从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
Run Code Online (Sandbox Code Playgroud)
这add_to_load_path是我正在寻找的方法.
Jam*_*oms 108
在当前版本的Rails(3.2.8)中,这已在application.rb文件中进行了更改.
该代码目前已被注释为:
# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
Run Code Online (Sandbox Code Playgroud)
将需要更新autoload_paths值.尝试修改以前的load_paths变量会导致此错误.
/configuration.rb:85:in `method_missing': undefined method `load_paths' for #<Rails::Application::Configuration:0xac670b4> (NoMethodError)
Run Code Online (Sandbox Code Playgroud)
例如,对于要添加到autoload_paths配置的每个路径,请添加类似于以下内容的行:
config.autoload_paths += %W(#{config.root}/app/validators)
Run Code Online (Sandbox Code Playgroud)
config.autoload_paths接受Rails将自动加载常量的路径数组.默认是所有目录app.
http://guides.rubyonrails.org/configuring.html
来自下面的评论家(hakunin):
如果目录在app/,你不需要在任何地方添加它,它应该只是默认工作(绝对在3.2.12).Rails 在开发过程eager_load_paths中起着重要的作用autoload_paths,并且在生产中充满了负担.所有app/*目录都会自动添加到那里.
rya*_*anb 60
对于旧版本的Rails:
您可以在environment.rb配置文件中执行此操作.
config.load_paths << "#{RAILS_ROOT}/app/widgets"
Run Code Online (Sandbox Code Playgroud)
-
对于Rails 3,请参阅下面的答案
Jac*_*cob 27
在Rails 3中,您可以在config/application.rb中设置它,默认情况下提供此示例:
# Add additional load paths for your own custom dirs
# config.load_paths += %W( #{config.root}/extras )
Run Code Online (Sandbox Code Playgroud)
Pet*_*per 21
在Rails 5中,您不必再在app目录中显式加载文件夹.放在里面的所有文件夹都可直接使用 您不必触摸任何配置文件.但似乎Spring存在一些问题.
因此,新的工作流程是:
spring stop在命令行上运行bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'在命令行上检查autoload-paths .现在应该列出新文件夹.spring start在命令行上运行Tia*_*nco 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
Run Code Online (Sandbox Code Playgroud)
rails 3的另一个更新 - activesupport 3.0.0:
代替:
ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets"
Run Code Online (Sandbox Code Playgroud)
您可能需要这样做:
ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/widgets"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50338 次 |
| 最近记录: |