2011-01-07 105 views
3

說我有一些不屬於模型,控制器等的自定義類,我應該把它放在/ lib中是否正確?Rails加載路徑問題

In rails < 3我將這個目錄添加到我的加載路徑中,並在rails 3+中,我將它添加到我的autoload_path中。它是否正確?

現在說我有一些類已經擴展了已定義的類。我應該在哪裏把它放在啓動時運行。例如說我想在String上添加方法'foo'。

 
class String 
    def foo 
    'foo; 
    end 
end 

我應該在哪裏放這個類,使其在啓動時定義?

我有另一個奇怪的錯誤是當我嘗試命名空間在lib中的類。

 
module MyProject 
class Foo 
end 
end 

現在在一個控制檯:

 
ruby-1.9.2-p136 :004 > MyProject::Foo 
LoadError: Expected /Users/me/workspace/my_project/lib/foo.rb to define Foo 
from /Users/rob/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:492:in `load_missing_constant' 
from /Users/rob/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:183:in `block in const_missing' 

我不斷收到此錯誤。我怎樣才能加載這個文件?

回答

3

可以一般把任何你想要的類文件,例如,你可以把他們在app /他人和目錄添加到您的LOAD_PATH在梁2或autoload_path對Rails 3

要延長已定義的類你可能會想把這些文件放在config/initializers目錄下。

要解決您提到的錯誤,您應該在foo.rb文件中定義Foo類,並確保模塊名稱匹配(Bags和MyProject)。

名稱更改爲自動加載的原因是the classes in autoload_paths are actually getting autoloaded, not simply loaded。這是Ruby中使用'autoload'和'require'的區別。

+0

手袋實際上是一個錯字。仍然收到該錯誤。有沒有其他地方可以把我想要的自動加載文件像初始化程序?不知道爲什麼Rails3只在自定義的時候自動加載,如果這個常量沒有被定義 – HelpMe

+0

除了autoload_paths,你還可以使用autoload_once_paths來定義在啓動Rails時只加載一次的目錄。確保在測試之間完全重新啓動控制檯或Rails應用程序 - 即使在開發中,即使在開發過程中,初始化程序和autoload_only_once路徑也只能加載一次。 –

+0

令人困惑的事情是,「自動加載」不會真正自動加載任何東西。它只是添加到類路徑中。一切在配置/初始化器實際上自動加載..即在啓動時運行 – HelpMe

8

在Rails 3,自動加載路徑在config/application.rb中

#config.autoload_paths += %W(#{config.root}/extras) 

你,如果你想從lib目錄加載代碼取消註釋此行禁止。