僕と技術とセキュリティ

セキュリティエンジニアの備忘録

uninitialized constant User::SessionsControllerを解決した話

おそらく同じパターンで困っている人と、同じエラーで躓くであろう未来の自分のために書く。

Rails でDeviceを利用している際に遭遇。 発生するタイミングはCentOSUbuntuのDocker上でしか再現しないという奇妙なエラー (Mac OSWindowsでは問題なく動作する)

User クラスを使用するページへアクセスすると以下のエラーになる。

uninitialized constant User::SessionsController

結論

以下の様にして解決
config/initializers/requirements.rb

require Rails.root.join("app/models/user.rb")
require Rails.root.join("app/controllers/User/sessions_controller.rb")

解決までの流れ

uninitialized constant = 「定義したクラスを読むことができない」
なので
Railsのお作法に習って以下のファイルを追加する。
このconfig/initializers配下のファイルはRails起動時に勝手に読み込まれる

config/initializers/requirements.rb

Userクラスが読み込まれていないので中身は以下の様にする

require Rails.root.join("app/models/user.rb")

結果、同じエラーが出る

uninitialized constant User::SessionsController

このファイル実は読み込まれていないのではないかと思い、
ファイルの中身をエラーが発生するようにして、rails restartする

結果、当該ファイルでエラーが発生するので 読み込まれている様だ。

/usr/src/rails_build_docker/config/initializers/requirements.rb:1:in `<main>': undefined method `ressssquire' for main:Object (NoMethodError)
Did you mean?  require
ubuntu@ip-172-31-29-8:~/rails_broken_app$ 

尚更タチが悪い。

ここで、SessionsController が読み込まれていないのならconfig/initializersで読み込ませれば良いのでは? ということに気づく。

config/initializers/requirements.rb

require Rails.root.join("app/models/user.rb")
require Rails.root.join("app/controllers/User/sessions_controller.rb")

とすると、sign_inページにアクセスしても当該エラーが表示されなくなった。