7

Rails 3.2.2を使用していて、特定のディレクトリにあるすべてのコードを再帰的にロードしたいと考えています。例えば:

[Rails root]/lib/my_lib/my_lib.rb
[Rails root]/lib/my_lib/subdir/support_file_00.rb
[Rails root]/lib/my_lib/subdir/support_file_01.rb
...    

グーグルに基づいて、私は試しました:

config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib/**"]
config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib/**/"]
config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib/**/*"]
config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib/{**}"]
config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib/{**}/"]

これらはいずれもコードをロードせず、「初期化されていない定数」エラーが発生します。

これにより、ファイルはに直接ロードされます/my_lib/が、サブディレクトリにはロードされません。

config.autoload_paths += ["#{Rails.root.to_s}/lib/my_lib"]

アップデート

コメントありがとうございます。

私はこれを私の中に入れましたapplication.rb

Dir["#{Rails.root.to_s}/lib/**/*.rb"].each { |file| config.autoload_paths += [file] }

アプリケーションは起動しますが、ライブラリで宣言されているクラスは使用できません。

> MyClass
NameError: uninitialized constant MyClass
4

4 に答える 4

11

autoload_paths and friends work only if the given files, or files in the given directories, are named according to the rails naming conventiion.

e.g. if a file some_class.rb is given to autoload_paths, it expcects the file to declare a class SomeClass, and sets up some magic to make any reference to SomeClass load that file on-the-fly.

So if you want to have it only load each of your files as they are needed, then you will have to name your files accordingly, and have one file per class.

If you are happy to load all of the files in a directory tree when rails starts, you can do this:

Dir.glob("/path/to/my/lib/**/*.rb").each { |f| require f }

The above will read every .rb file in /path/to/my/lib, and any directories under it.

于 2012-04-16T03:08:49.960 に答える
3

Here is a simpler way to add the whole lib directory that does not require .each and feels more straightforward than other answers

config.autoload_paths += Dir["#{config.root}/lib/**/"]

Refer to @Michael Slade's answer for a nice summary of what autoloading does

于 2018-08-03T16:48:00.410 に答える
2

The autoload paths have to be explicit paths--they can't contain file globs (wildcards).

Therefore, you'll have to do the expansion first:

Dir["#{Rails.root.to_s}/lib/my_lib/**/*.rb"].each do |path|
  config.autoload_paths += [path]
end
于 2012-04-16T01:15:34.957 に答える
0

Also you can try .

application.rb :

  config.autoload_paths += %W( #{config.root}/app/model/super_model )
  config.autoload_paths += %W( #{config.root}/lib )
于 2012-04-16T12:01:56.333 に答える