「Ruby/rails/autoload」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→rails5以降productionではエラーとなる) |
(→autoloadを使わなくてもサービスは呼べる) |
||
(同じ利用者による、間の3版が非表示) | |||
行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 | ||
行23: | 行37: | ||
==呼び出しサンプル== | ==呼び出しサンプル== | ||
+ | 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 | app/controller/test_controller.rb | ||
class TestController < ApplicationController | class TestController < ApplicationController | ||
行33: | 行69: | ||
end | end | ||
− | + | app/services/test_service.rb | |
class TestService | class TestService | ||
def initialize(name) | def initialize(name) | ||
行43: | 行79: | ||
attr_accessor :name | attr_accessor :name | ||
end | 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などのサーバの再起動は必須