18754


Rails3.2からRails4.0最新バージョンに上げたところ自作で作ったライブラリが読み込めなくなりました。  
作成していたライブラリは以下のようなものです。

  * lib/active_support/core_ext/object.rb
[code]     require 'active_support/core_ext/object/hoge'

    
[/code]

  * lib/active_support/core_ext/object/hoge.rb
[code]     class Float

      def hoge(poge=0)
        moge = 10.0 ** poge
      end
    end
    
[/code]

Floatを拡張したhogeメソッドを呼び出すことが出来ません。Rails3.2では動いていました。  
config/application.rbにconfig.autoload_pathsを追記してみても呼び出せませんでした。  
app/models/concernsにおいても駄目でした。  
読み込み方法を教えて頂きたいです。


CC BY-SA 3.0
2015-11-12T09:37:51.620
18731
2015-11-12T15:39:48.343
10851
question
ruby-on-rails ruby rubygems
Rails4 で lib ディレクトリの自作ライブラリを読み込めない


Railsのバージョンの違いが原因かどうかは定かではないですが、autoload先の定数（モジュール／クラス）に対する理解があやふやになっているかと思います。

まず、autoloadするlib以下のディレクトリ構造は、定義する定数の構造と一致していなければなりません。  
以下のサイトが分かりやすいと思います。  
<http://easyramble.com/auto-load-rails-lib.html>

その点を踏まえた上で、じゃあその構造通りに定義すれば上手くいくのかといえば、そうもいきません。`config.autoload_paths`にlibを追加しても、autoloadの探索先に追加されるだけであって、自動的にrequireしてくれるわけではありません。requireされるのは、（大雑把に言うと）初めてその定数にアクセスしたときです。

autoloadの挙動を理解したければ、以下のような手順で確認できます。

lib/extensions.rb

[code]

    p '★★★★★★★'
    module Extensions
    end
    
[/code]

`rails c`を実行して、コンソール上で`Extensions`と入力すると、

[code]

    "★★★★★★★"
    => Extensions
    
[/code]

と表示され、ここで初めてこのファイルが読み込まれているのが分かります。

ご質問内容は`Float`に対するモンキーパッチで、定義済みの定数に対するautoloadなので、結果的には明示的にrequireをしてやる必要があります。ただし、autoloadされる側でrequireを呼ぶのはバッドプラクティスなので、initializerを使用するのが定石です。

lib/extensions.rb

[code]

    class Float
      def hoge(poge=0)
        moge = 10.0 ** poge
      end
    end
    
[/code]

config/initializers/require.rb

[code]

    require 'extensions'
    
[/code]

参考

  * <http://easyramble.com/auto-load-rails-lib.html>
  * <https://stackoverflow.com/questions/19098663/auto-loading-lib-files-in-rails-4>
  * <http://railsguides.jp/constant_autoloading_and_reloading.html>


CC BY-SA 3.0
2015-11-12T15:39:48.343
18754
2015-11-12T15:39:48.343
2017-05-23T12:38:55.250
-1
9608
18731
answer