post: 2023-02-10
INDEX ▶
Zeitwerkのエラー顛末
前提
- graphql-rubyを導入したRailsアプリケーション
- 確認用にGraphiQL入れている
- GraphiQL用のControllerを追加していた
起きたこと
- Railsが起動できない
- development環境
# エラー内容
Zeitwerk::NameError:
expected file /home/circleci/project/app/controllers/graphiql_controller.rb to define constant GraphiqlController, but didn't
raise Zeitwerk::NameError.new("expected file #{file} to define constant #{cpath}, but didn't", cref.last)
^^^^^
対応 1
- そもそもController名が間違っていたので以下のように修正
GraphiqlController -> GraphiQLController
- クラス名が見つけられない旨の内容だったのでそれ関連で調べた
- inflectorで小文字をキャメルケースに変換する処理を入れた
# config/initializers/zeitwerk.rb
Rails.autoloaders.each do |autoloader|
autoloader.inflector.inflect(
"graphiql" => "GraphiQL"
)
end
起きたこと 2
- 解決したと思ってpushしたら、連携しているCI側でエラーが起きた
- 内容は同じ
対応 2
- config/environments/test.rb でconfig.eager_load =
false
としてみる- CIが通ることを確認
- config/environments/development.rb で config.eager_load =
true
としてみる- Railsが正常に起動することを確認
疑問
GraphiQLControllerを読み込んだ際に起きていることは分かったが、何故development環境では正常に起動できているのか?
対応 3
- コードを再度よくよく見てみる
- "graphiql-rails" がdevelopment環境指定になっていた
- development環境でしか使用しないのでその指定にしていたが、GraphiQLControllerは自前で存在しているので全環境でロードする
- 全環境指定に変更し、config/environments/test.rb の config.eager_load = trueに戻した
- CIが通ることを確認
- 対応 1で行った config/initializers/zeitwerk.rbを削除してもCIが通ること確認
結論
- 間違いは2点あった
- 自前で作成したGraphiQLControllerのクラス名が間違っていた -> development環境で起きた問題
- "graphiql-rails" の環境指定が間違っていた -> CIで起きた問題
- どちらともGraphiqlControllerというクラス名が見つけられないという、名前解決系エラーだったためそもそも問題が2つあったということに気づくまで時間がかかった
- initializerを追加するという、必要の無い対応を先に入れてしまったためさらにややこしい状況になっていた
- inflector処理はgraphiql-rails側に入っているので自前で追加しなくても良い
- graphiql-railsの処理