0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-07-24

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

参考

0
0
1

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
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?