2012-07-13 9 views
7

モデルやコントローラボックスにうまく収まらないRailsコードがあります。だからthis answerごとに、私はapp/classesディレクトリを作成しました。 Rails 3はこれをRailsの "load path"に自動的に追加するようですが、私のアプリケーションでは、requireステートメントを使わなくてもそこで定義したクラスを正しく見つけることができます。Rails 3.2.x:開発中にapp/classesディレクトリをリロードする方法は?

ただし、app/classesのコードは開発モードでリロードされません。私が変更を加えると、その変更を見るためにサーバーを再起動する必要があります。

Rails 3.2.xで特定のディレクトリを「再読み込み可能」にする適切な方法は何ですか?いくつかの答えはここにやってお勧めします:

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

が、私は、これは単に内のコードを見つけるために、ディレクトリの初期セットにapp/classesを追加する効果を持っていると信じています。リクエストごとにリロードすることはできないようです(さらに3.xではapp/*が自動的に追加されるようです)。

更新

私は私のクラスは、モジュール内にラップだった:

図、私は単なる30秒質問を投稿した後、ソリューションにつまずきました。周囲の「MyModule」を削除すると、突然再読み込みが可能になりました。 Javaの背景から来て、グローバルな名前空間を汚染するRubyコードが焼かれてしまったので、私はすべてをモジュールの中に入れるという習慣を開発しました。私は、Railsの "app"コードはどのモジュールの外にも存在しなければならないと思いますか?

+3

あなたの名前を 'classes'の下にサブディレクトリを作成して、そこにモジュールのすべてのクラスを入れてみてください。私は 'bar.rb'という名前のファイルが変更されていると思われますが、' Bar'クラスが使われている場合にのみ読み込まれますが、フルネームが 'Foo :: Bar'の場合は読み込まれません。リロードする 'foo/bar.rb'。しかし、ちょうど推測です。 – Thilo

答えて

2

モジュールを別のファイルに宣言しましたか、暗黙的にクラス内に宣言しましたか?これは自動ロードの動作に影響する可能性があります。 module Foo; class Barclass Foo::Bar。 Railsのオートローダーがfoo.rbをFooモジュールと一緒に見つけることができない場合、Fooモジュールは読み込みをスキップする可能性があります。

+0

モジュールは次のような同じファイルで宣言されました:Module Foo;クラスバーと呼ばれ、コード全体でFoo :: Barと呼ばれます。 –

+0

クラス/モジュールとファイルの間に1対1の関連があるので、個別のモジュールファイルを作成する価値があります。 – tadman

関連する問題