LoginSignup
0

More than 1 year has passed since last update.

posted at

updated at

Rails5.2から6.1に更新する際に躓いたところ(zeitwerk)

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は探索できない)

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0