facebook twitter hatena line email

Ruby/rails/autoload

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

現状autoloadの確認

$ bundle exec rails r 'puts ActiveSupport::Dependencies.autoload_paths'
/var/www/rails/helloworld/app/assets
/var/www/rails/helloworld/app/channels
/var/www/rails/helloworld/app/controllers
/var/www/rails/helloworld/app/controllers/concerns
/var/www/rails/helloworld/app/helpers
/var/www/rails/helloworld/app/jobs
/var/www/rails/helloworld/app/mailers
/var/www/rails/helloworld/app/models
/var/www/rails/helloworld/app/models/concerns
/var/www/rails/helloworld/app/services
/var/www/rails/helloworld/test/mailers/previews

autoloadを使うための準備

config/application.rb

module Helloworld
  class Application < Rails::Application
    config.autoload_paths += %W(#{config.root}/lib) # これを追加
  end
end

rails5以降productionではエラーとなる

以下もapplication.rbに追加

config.paths.add 'lib', eager_load: true


rails5ではあまりautoloadは推奨ではない。

参考:https://qiita.com/K_Yagi/items/edc46fd976526279312b

autoloadを使わなくても、app/services/test_service.rbはTestServiceで呼べるっぽいので別にautoloadは必要ないかも。

追加したautoloadの確認

bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'
/helloworld/lib

呼び出しサンプル

app/controller/test_controller.rb

class TestController < ApplicationController
 def hello
   test_module = TestModule.new("test1")
   require 'logger'
   log = Logger.new('/tmp/log')
   log.debug(test_module.exec()) # test1
 end
end

app/services/test_module.rb

class TestModule
  def initialize(name)
     @name = name
  end
  def exec()
     return @name
  end
  attr_accessor :name
end

autoloadを使わなくてもサービスは呼べる

app/controller/test_controller.rb

class TestController < ApplicationController
 def hello
   test_service = TestService.new("test1")
   require 'logger'
   log = Logger.new('/tmp/log')
   log.debug(test_service.exec()) # test1
 end
end

app/services/test_service.rb

class TestService
  def initialize(name)
     @name = name
  end
  def exec()
     return @name
  end
  attr_accessor :name
end

NameError in uninitialized constant エラーとなる場合

autoloadを効かせるにはunicornなどのサーバの再起動は必須