4

モジュール (名前空間) 内で定義されているすべてのクラスを一覧表示する方法を探しています。問題に関する同様の質問があります: Ruby の名前空間ですべてのクラス名を取得する方法は?

ただし、最後の返信を参照してくださいModule.constants。クラスが呼び出される/ロードされるまでは空です。各クラスを手動で参照せずにこれを行う方法はありますか?

Rails 3.2 でこの機能を使用しようとしていますが、イニシャライザで各クラスを要求する方法しか見つかりませんでした (試していませんが、手動で入力する必要があります...)。

お時間をいただきありがとうございます。

4

3 に答える 3

2

ブライアンが提供したものに基づいて、これを使用して、特定の親名前空間から定数/クラスを取得できます。ファイル名/クラス名が文字列で始まる/終わる場合でも:

require 'pathname'

# make this the directory you are autoloading from
autoload_dir = File.join(Rails.application.root, 'app', 'models')

# this will return FooBar::BarFoo::**::*Boo constants and autoload them
Dir.glob(File.join(autoload_dir, 'foo_bar', 'bar_foo', '**', '*_boo.rb')).collect{|pathname| Pathname.new(pathname.chomp('.rb')).relative_path_from(Pathname.new(autoload_dir)).to_s.camelize.constantize}
于 2013-05-24T20:18:41.007 に答える
2

次のように、名前空間付きディレクトリ内のファイルをグロブできます。

Dir.glob('/path/to/namespaced/directory/*').collect{|file_path| File.basename(file_path, '.rb').constantize}

したがって、Rails の初期化ファイルまたはモデルでは、次のことができます。

Dir.glob(File.join(Rails.root, "app", "models", "my_namespace", "*")).collect{|file_path| File.basename(file_path, '.rb').constantize}
于 2012-11-20T17:42:38.727 に答える
2

Bryan Liff の簡潔でエレガントな答えはほぼ正しいですが、エラーがスローされます。代わりに、次を試してください。

Dir.glob(File.join(Rails.root, "app", "models", "my_namespace", "*")).collect{|file_path| File.basename(file_path, '.rb').camelize.constantize}

の使用に注意してくださいcamelize。これをコメントに投稿したはずですが、そうするのに十分な評判がありません。

于 2017-07-14T18:39:49.530 に答える