web-dev-qa-db-ja.com

なぜRails app / servicesからクラスを自動ロードしないのですか?

私はRails 4.2アプリで作業しており、構造にapp/services/fetch_artists.rbを追加しました。このファイル内で、class FetchArtists; endを定義しました。

Rails r 'FetchArtists'を実行しようとすると、NameError: uninitialized constant FetchArtistsが表示されます。

私はActiveSupport::Dependencies.autoload_pathsを見てみましたが、実際、app/servicesはありません:

/.../app/assets
/.../app/controllers
/.../app/helpers
/.../app/jobs
/.../app/mailers
/.../app/models
/.../app/controllers/concerns
/.../app/models/concerns
/.../spec/mailers/previews

私の質問は、このフォルダーが自動的にロードされないのはなぜですか、それをどうすればいいのですか?

[〜#〜] edit [〜#〜]

非常に奇妙なことに、Rails runnerを使用して上記のコマンドを繰り返し実行すると、新しいフォルダーがオートロードパスに表示されます。これがなぜそんなに遅れて起こったのか、私にはわかりません。

誰かがこれがspringを扱うかもしれないと示唆した。この状況で他の多くの人にも役立つ可能性があるので、これについてもっと聞きたいです。

48
linkyndy

同じ問題が発生しましたが、アプリのプリロードを処理するプロセスであるSpringのキャッシュの問題のようです。 WebサーバーとコンソールおよびRakeタスクに使用されます。

bin/spring stopを使用してSpringを停止すると、Springはアプリを新鮮にロードします。 Rails consoleを実行してActiveSupport::Dependencies.autoload_pathsを検査すると、app/servicesが正常に表示されます。

81
maknz

私の場合、春はapp/servicesディレクトリの変更-Springを再起動するとクラスがロードされますが、既存のクラスまたは新しいクラスを変更するには、Springを再起動して適用する必要があります。

この問題を解決するために、Springが監視するディレクトリのリストにconfig/spring.rb

%w(
  .Ruby-version
  .rbenv-vars
  tmp/restart.txt
  tmp/caching-dev.txt
  app/services
).each { |path| Spring.watch(path) }

springをもう一度再起動しました。

14
Brian

私は同様の問題に遭遇し、Springのドキュメントをざっと見て、 watchers についてこのビットを見つけました。

Application.rbに次のコードを追加しましたが、うまくいきました-

Spring.watch "app/services/**"

私はここでは専門家ではありません、ymmv。

12
sbauch

私は同じ問題を抱えていましたが、解決策は見つかりませんでした。オートロードが最終的にロードされるのを待つだけの忍耐力がないので、私の簡単な解決策は、eager_loadをオンにしてサーバーを起動することでした。最終的にそれをロードします。その後、スイッチをオフにしましたが、クラスはまだロードされていました。

次を使用します:config.eager_load = true

あなたのconfig/environments/development.rb

6