Rails7で「parent.const_defined?(cname, false)」が表示されたときの対応方法

created
updated

Railsのアプリケーションを起動するとconst_defined?のエラーが発生

00:00:00 app | /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader/helpers.rb:89:in `const_defined?': wrong constant name Book.rb 00-00-01-594 (NameError)
00:00:00 app | 
00:00:00 app |     parent.const_defined?(cname, false)
00:00:00 app |           ^^^^^^^^^^^^^^^
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader/helpers.rb:89:in `cdef?'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader.rb:411:in `autoload_file'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader.rb:340:in `block in set_autoloads_in_dir'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader/helpers.rb:26:in `block in ls'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader/helpers.rb:18:in `each_child'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader/helpers.rb:18:in `ls'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader.rb:335:in `set_autoloads_in_dir'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader.rb:103:in `block (2 levels) in setup'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader.rb:102:in `each'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader.rb:102:in `block in setup'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader.rb:99:in `synchronize'
00:00:00 app |       from /usr/local/bundle/gems/zeitwerk-2.5.4/lib/zeitwerk/loader.rb:99:in `setup'
00:00:00 app |       from /usr/local/bundle/gems/railties-7.0.2.2/lib/rails/application/finisher.rb:44:in `block in <module:Finisher>'
00:00:00 app |       from /usr/local/bundle/gems/railties-7.0.2.2/lib/rails/initializable.rb:32:in `instance_exec'
00:00:00 app |       from /usr/local/bundle/gems/railties-7.0.2.2/lib/rails/initializable.rb:32:in `run'
00:00:00 app |       from /usr/local/bundle/gems/railties-7.0.2.2/lib/rails/initializable.rb:61:in `block in run_initializers'

原因は、ファイル名とクラス名が一致していないから発生する

ファイルを誤ってコピーしてしまっている

1つ確認できた現象は、下記のようなファイルが誤って存在していました。

app/models/book.rb
app/models/book.rb - コピー

クラス名とファイル名が不一致のため、発生しているエラーだと思います。

クラス名がタイプミスしている

# app/models/book.rb
class Boook < ApplicationRecord
  # ..
end

確かではないですが、上記のようなタイプミスでも発生していたと思います。

「parent.const_defined?(cname, false)」の発生時は、差分の確認をしよう

「parent.const_defined?(cname, false)」が現れた時は、git statusのコマンドなどで、誤っているファイルが追加されていないか確認しましょう。

TOP