私は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
を扱うかもしれないと示唆した。この状況で他の多くの人にも役立つ可能性があるので、これについてもっと聞きたいです。
同じ問題が発生しましたが、アプリのプリロードを処理するプロセスであるSpringのキャッシュの問題のようです。 WebサーバーとコンソールおよびRakeタスクに使用されます。
bin/spring stop
を使用してSpringを停止すると、Springはアプリを新鮮にロードします。 Rails console
を実行してActiveSupport::Dependencies.autoload_paths
を検査すると、app/services
が正常に表示されます。
私の場合、春は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をもう一度再起動しました。
私は同様の問題に遭遇し、Springのドキュメントをざっと見て、 watchers についてこのビットを見つけました。
Application.rbに次のコードを追加しましたが、うまくいきました-
Spring.watch "app/services/**"
私はここでは専門家ではありません、ymmv。
私は同じ問題を抱えていましたが、解決策は見つかりませんでした。オートロードが最終的にロードされるのを待つだけの忍耐力がないので、私の簡単な解決策は、eager_loadをオンにしてサーバーを起動することでした。最終的にそれをロードします。その後、スイッチをオフにしましたが、クラスはまだロードされていました。
次を使用します:config.eager_load = true
あなたのconfig/environments/development.rb