29

特定のクラスの子孫を見つけることができるように、アプリ全体をロードできるようにしたいと考えています。

たとえば、次のクラスが定義されているとします。

# app/models/foo_class.rb
class FooClass < MySpecialBaseClass
  # pasta code
end

次の場合は見つかりません。

irb> ObjectSpace.each_object.select { |obj| obj.is_a?(Class) && obj <= MySpecialBaseClass }
=> []

const を呼び出すまで:

irb> FooClass

その後、次のように返されます。

irb> ObjectSpace.each_object.select { |obj| obj.is_a?(Class) && obj <= MySpecialBaseClass } 

=> [FooClass]

どうすればこれを行うことができますか?

4

4 に答える 4

39

さて、掘り下げた後、実際には非常に簡単です。以下を実行するだけです。

Rails.application.eager_load!
于 2013-11-12T06:48:34.483 に答える
9

Railsアプリケーションの構成から

  1. config.eager_load true の場合 Eager は、登録されているすべての config.eager_load_namespaces をロードします。これには、アプリケーション、エンジン、Rails フレームワーク、およびその他の登録済み名前空間が含まれます。
  2. config.eager_load_namespaces は、config.eager_load が true の場合に熱心に読み込まれる名前空間を登録します。リスト内のすべての名前空間は、eager_load! に応答する必要があります。方法。
  3. config.eager_load_paths は、キャッシュ クラスが有効な場合に Rails がブート時に熱心にロードするパスの配列を受け入れます。アプリケーションの app ディレクトリ内のすべてのフォルダーにデフォルト設定されます。

編集:

手動でロードするには、次のようなことができるはずです:

matcher = /\A#{Regexp.escape(load_path)}\/(.*)\.rb\Z/
Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
  require_dependency file.sub(matcher, '\1')
end
于 2013-11-11T18:20:39.420 に答える