33762


こんにちは

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

[code]

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

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

* * *
[code]

    # hoge.rb
    class Hoge
      def hello
        puts "Hoge#hello"
      end
    end
    
[/code]

* * *
[code]

    # 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
    
[/code]

* * *
[code]

    # console
    PS C:\work\testApp> bundle exec rails c
    Loading development environment (Rails 5.0.2)
    
    [1] pry(main)> Hoge
    NameError: uninitialized constant Hoge
    from (pry):1:in `<main>'
    
[/code]

* * *
[code]

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

* * *

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でも問題はありません。  
以上、お手数ですがよろしくお願いいたします。


CC BY-SA 3.0
2017-04-03T09:37:53.510
33743
2017-04-04T07:42:06.923
2017-04-04T05:43:11.320
20774
20774
question
ruby-on-rails
lib配下のディレクトリに格納しているファイルを読み込みたい


> できれば「config.autoload_paths += %W(#{config.root}/lib/test)」などを追加せずに1行でまとめたい。

これだとどうですか？

[code]

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


CC BY-SA 3.0
2017-04-04T05:09:30.723
33757
2017-04-04T05:09:30.723
5008
33743
answer


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

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

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

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

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


CC BY-SA 3.0
2017-04-04T07:42:06.923
33762
2017-04-04T07:42:06.923
5793
33743
answer