2009-08-03 69 views
58

從Rails 2.3開始,將目錄添加到加載路徑的正確方法是什麼,以便它能夠掛鉤到Rails的自動重新加載機制中?將目錄添加到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的方法,我要找的。

回答

60

對於較舊版本的Rails

你可以在你的environment.rb配置文件做到這一點。

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

-

對於的Rails 3,看到答案婁

+8

ActiveSupport :: Dependencies.autoload_paths <<「#{RAILS_ROOT}/app/widgets」 – 2010-11-21 07:15:16

+1

請參見pocket-full-quarter的答案,這實際上是正確的。這一個現在已經過時了。 – micapam 2013-10-10 02:38:02

1

我發現我所需要的配置後,要做到這一點block--來配置對象進不去了。

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

在Rails 3,您可以在配置/ application.rb中,在這個樣本是默認提供設置此 - 3.0.0的ActiveSupport:

相反的:

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

您可能需要這樣做:

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

#config.autoload_paths + =%W(#{config.root} /演員) – tamersalama 2010-11-02 19:05:50

8

鋼軌3另一個更新:

這奏效了

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

Rails.root是必要的導軌3,而不是RAILS_ROOT – 2011-02-16 11:31:31

+0

下滑軌3.0.3,我不得不使用 的ActiveSupport :: Dependencies.autoload_paths + =%W(#{Rails.root.to_s}/app/libs) – 2011-04-29 03:11:48

101

在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

您正在回答一個3歲的問題,並且當問這個問題時rails 3不存在 – Bassetassen 2012-10-10 19:37:51

8

On Rails的5,你需要添加以下代碼到environment.rb中:

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

Rails的5你不必從應用程序目錄中顯式地加載文件夾了。放在裏面的所有文件夾都可以直接使您不必觸摸任何配置文件。但似乎Spring有一些問題。因此

新的工作流程是:

  1. 在命令行上的命令行
  2. 支票上創建/ app目錄
  3. 運行spring stop內的新文件夾和類bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'自動加載路徑。現在應列出新文件夾。
  4. 在命令行中運行spring start
2

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

文件應該是這樣的:

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

我知道這個工程的軌道4和5可能其他人也。