sugiii8's tech blog.
post: 2023-02-10
INDEX

Zeitwerkのエラー顛末

thumbnail

前提

  • 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
# 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の処理