facebook twitter hatena line email

「Ruby/rails/autoload」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(autoloadを使わなくてもサービスは呼べる)
 
(同じ利用者による、間の8版が非表示)
行1: 行1:
 +
==現状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を使うための準備==
 
==autoloadを使うための準備==
 
config/application.rb
 
config/application.rb
行10: 行24:
 
以下もapplication.rbに追加
 
以下もapplication.rbに追加
 
  config.paths.add 'lib', eager_load: true
 
  config.paths.add 'lib', eager_load: true
 +
  
 
rails5ではあまりautoloadは推奨ではない。
 
rails5ではあまりautoloadは推奨ではない。
 +
 
参考:https://qiita.com/K_Yagi/items/edc46fd976526279312b
 
参考:https://qiita.com/K_Yagi/items/edc46fd976526279312b
 +
 +
autoloadを使わなくても、app/services/test_service.rbはTestServiceで呼べるっぽいので別にautoloadは必要ないかも。
  
 
==追加したautoloadの確認==
 
==追加したautoloadの確認==
 
  bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'
 
  bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'
 
  /helloworld/lib
 
  /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などのサーバの再起動は必須

2017年11月9日 (木) 11:13時点における最新版

現状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などのサーバの再起動は必須