Rails5.2から6.1に更新する
- bulk insertを使いたかった。
- gem単体でも入れられるらしいけど、まあついでに。
6.xからはオートロード(requireしなくてもクラス参照できるアレ)の仕組みが刷新されている = zeitwerk
さっとさらった概要
以前は下記参照ルールだったらしい。
使われている定数の名前 -> 定義しているファイル名の特定
新しいオートロードでは以下参照ルール。
定義しているファイル名の特定 -> 使われている定数の名前
今まで参照できていた、Concernsに入れてるクラスが参照できなくなった???(本題)
controller/concerns/gas_api_callable.rb
# GAS APIコールする共通モジュール
module GasAPICallable
extend ActiveSupport::Concern
### code ####
end
end
controller/concerns/gas_controller.rb
# GasAPICallableを使って色々するコントローラー
class GasController < ApplicationController
include GasAPICallable
### code ###
end
------> uninitialized constants "GasAPICallable" エラー発生。
ファイル名のCapitalize(大文字化)から定数名を探すことで、「API」というアクロニム(略称)がひろえなくなっているみたい。(根本原因)
gas_api_callable.rb -> GasApiCallable ----> GasAPICallableはあるけど、GasApiCallableはないよ???? -> const未定義エラー
対処1 アクロニムをやめる(大文字略称をやめる)
controller/concerns/gas_api_callable.rb
# GAS APIコールする共通モジュール
- module GasAPICallable
+ module GasApiCallable
extend ActiveSupport::Concern
### code ####
end
end
controller/concerns/gas_controller.rb
# GasAPICallableを使って色々するコントローラー
class GasController < ApplicationController
- include GasAPICallable
+ include GasApiCallable
### code ###
end
参照できた。
対処2 アクロニムをzeitwerkに伝える。
config/initializeers/zeitwerk.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.acronym "API"
end
※ただしこの場合すべてのAPI
という単語をAPI
として定義しなければならない(Api
は探索できない)
参考