config.autoload_paths += %W( #{Rails.root}/lib ) こんな感じのコードありますよね。 これだと、たしかにautoloadはされるんですが、eager_loadはされないのです。なので、eager_loadが有効になっている本番環境などで、状況によってはNameErrorが起きてしまう。 代わりに、
![Railsでlibディレクトリを使うときはconfig.paths.addを使おう - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/ac6a585025ea2c47bf41b66132ffe8ede041271e/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9UmFpbHMlRTMlODElQTdsaWIlRTMlODMlODclRTMlODIlQTMlRTMlODMlQUMlRTMlODIlQUYlRTMlODMlODglRTMlODMlQUElRTMlODIlOTIlRTQlQkQlQkYlRTMlODElODYlRTMlODElQTglRTMlODElOEQlRTMlODElQUZjb25maWcucGF0aHMuYWRkJUUzJTgyJTkyJUU0JUJEJUJGJUUzJTgxJThBJUUzJTgxJTg2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz0wNzljMjhmZTRlYmFjM2ZjYzQ0MDZkZTc5YTA5OWMxYg%26mark-x%3D142%26mark-y%3D57%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBva3VyYW1hc2FmdW1pJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0zNjk3MWNkZTE0ZGZjNDdiZTYzNTk0MDBkYWUxZGNjYw%26blend-x%3D142%26blend-y%3D486%26blend-mode%3Dnormal%26s%3Dc03a2e5175a8a58ec2d6924acd964afd)
なんてよくやったりしますが、いざこれを本番で動かしてみると NameError: uninitialized constant HogeUtilを食らったので autoload周りの設定が違うのかな〜と思い色々ググるも出てくるのは「autoload_pathsに/libを読ませればok」といった記事ばかり... それもそのはず、出てくる記事の情報はRails4以前のものばかりで、今回のエラーが出るのはRails5から。 原因に辿り着くまでに時間がかかってしまった... 解決策 若干厄介なのは本番環境時においてはautoloadが無効化されておりeager load(rails起動時にまとめて読み込む機能)が有効で、開発環境では逆にautoloadが有効でeager loadが無効になっています。(デフォルトの設定の場合。参考: Rails アップグレードガイド | Rails ガイド) 故
Rails で lib 以下にライブラリを配置することは多い1と思いますが、その際、何も考えずに autoload_paths を指定すると、思わぬ落とし穴にハマる可能性があります。 具体的には 「ディレクトリを切って、別のネームスペースを与えているにもかかわらず、重複するクラス名があると死ぬ」 という現象に陥ります。 この現象に遭遇したことがある方は、読んでいただけると解決するかと思います。 単に lib 以下を Rails に追加したいんだよ!という方は、結論まで Goto していただければ大丈夫です。 はじめに Rails に lib を加えるためのコードについて、ざっくり以下の3パターン2を今まで目にしたことがあります。
通常のRubyプログラムでは、使いたいクラスやモジュールを定義したファイルを明示的に読み込みます。たとえば、以下のコントローラではApplicationControllerクラスやPostクラスを参照しており、通常はこれらに対してrequire呼び出しを行います。 # Railsではこのように書かないこと require "application_controller" require "post" # Railsではこのように書かないこと class PostsController < ApplicationController def index @posts = Post.all end end Railsは、必要に応じてクラスやモジュールを開発者の代わりに自動読み込み(autoload)します。これが可能になるのは、RailsがセットアップするいくつかのZeitwerkローダーのお
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く