lib配下のディレクトリに格納しているファイルを読み込みたい

投稿者: Anonymous

こんにちは

ruby on rails のapplication.rbに以下を記入して、lib/test/hoge.rbを読み込みたいと考えています。

config.enable_dependency_loading = true
config.autoload_paths += %W(#{config.root}/lib)

しかし、上記を記入したところhoge.rbの内容を読み込んでくれません。
下記がファイルの内容とコマンドの実行結果になりますが、どうすれば読み込むようになるでしょうか?


# hoge.rb
class Hoge
  def hello
    puts "Hoge#hello"
  end
end

# application.rb
module TestApp
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
    config.enable_dependency_loading = true
    config.autoload_paths += %W(#{config.root}/lib)
  end
end

# console
PS C:worktestApp> bundle exec rails c
Loading development environment (Rails 5.0.2)

[1] pry(main)> Hoge
NameError: uninitialized constant Hoge
from (pry):1:in `<main>'

PS C:worktestApp> bundle exec rails runner 'puts ActiveSupport::Dependencies.autoload_paths'
C:/work/testApp/lib
C:/work/testApp/app/assets
(略)
C:/work/testApp/test/mailers/previews

rails rの実行結果より対象のtestディレクトリ以下を読み込んでないと推測していますが、具体的な解決策がわからず困っております。
※他のディレクトリを読み込む可能性がありますので、できれば「config.autoload_paths += %W(#{config.root}/lib/test)」などを追加せずに1行でまとめたい。

どなたか解決策がわかる方がいらしましたら教えていただけると助かります。
なお各バージョンは
Rails 5.0.2
ruby 2.4.0p0 (2016-12-24 revision 57164) [x64-mingw32] となります。

~(追記)~
なお、hoge.rbの配置ディレクトリは/lib/test/である必要があり、
呼び出し方は、できれば new Hoge などとやりたいですが、Test::Hogeでも問題はありません。
以上、お手数ですがよろしくお願いいたします。

解決

Railsのautoloadの仕組みを簡単に説明すると、Foo::Barが現れたら、autoload_pathsに書かれたディレクトリからfoo/bar.rbを探してrequireします。

lib/test/hoge.rbHogeを定義したいなら、autoload_pathsにはlib/testを追加する必要があります。同じファイルをautoload_pathslibにした状態で読みたいのであれば、クラスはTest::Hogeである必要があります。

パスやクラス名を間違えると失敗しますので、うまく行かない時は

  • autoload_pathsの内容
  • ファイルのパス
  • クラス定義
  • 参照しているクラス

をひとつずつ確認してください。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *