2011-01-07 9 views
3

私はモデル、コントローラなどに属さないカスタムクラスをいくつか持っていますが、これを/ libに入れてください。Railsロードパスの質問

レール中< 3私はこのディレクトリを私のloadpathとレール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

あなたは、一般的に3

すでに定義したクラスを拡張するためのRailsでRailsの2かautoload_pathにアプリ/他の人にそれらを置くことができ、たとえば、あなたが好きな場所クラスファイルを入れて、あなたのLOAD_PATHにディレクトリを追加することができますおそらくあなたのconfig/initializersディレクトリにファイルを置くことになります。

このバグを修正するには、foo.rbファイルにFooクラスを定義し、モジュール名が一致するようにする必要があります(BagsとMyProject)。

名前が自動ロードに変更された理由は、the classes in autoload_paths are actually getting autoloaded, not simply loadedです。これは、Rubyで 'autoload'と 'require'を使用することの違いです。レール3に

+0

バッグは実際にはタイプミスでした。まだそのエラーを取得しています。イニシャライザのように自動ロードしたいファイルはどこに置いてもかまいません。定数が定義されていない場合、Rails3がautoloadsを実行したときにRails3がautoloadを呼び出す理由を確認しない – HelpMe

+0

autoload_pathsに加えて、autoload_once_pathsを使用すると、Railsの起動時に一度だけロードされるディレクトリを定義できます。開発中であっても、イニシャライザとautoload_only_onceパスは開発中であっても一度しかロードされないため、テストの間にコンソールやレールアプリケーションを完全に再起動していることを確認してください。 –

+0

本当に混乱していることは、「オートロード」が本当に何かを自動ロードしないということです。クラスパスに追加するだけです。 config/initializersのすべてが実際に自動ロードされます。つまり、起動時に実行されます。 – HelpMe

8

は、自動ロードパスを設定/あなたはLIBディレクトリからコードをロードする場合は、この行を非コメントする必要はapplication.rb

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

で無効になっています。