環境
Rails5.2
Ubuntu20.4
はじめに
モデル名の名前の付け方をしくじって、トラブル解決に時間をかけてしまった話です。始めに、モデル名に次のような、スネークケースの形式で名前を付けました。
rails g model Test_Test_1
何がいけなかったのかといえば、数字の前にアンダーバーをつけてしまったことです。なぜ、テーブル名の末尾に数字を使ったのかといえば、Test_Test_1、Test_Test_2、Test_Test_3と、いった具合に、同じテーブル名にして、連番を付けたかったためです。
このようなモデル名でテーブルを作成した後、コントローラーからそのモデルのクラスを呼び出したとき、つぎのようなエラーが発生しました。
uninitialized constant
つまり、そのような名前のクラスは存在しませんというエラーです。いや、あるんですが・・・と思っていたのですが、原因は、モデルの名前の付け方にありました。
結論を言うと、モデル名をTest_Test_1ではなく、Test_Test1で作り変えると上手くいきました。モデル名の末尾をアンダーバー+数字の形式にすると、Railsがスネークケースとして認識してくれないようです。
モデル名をスネークケースでつけると、モデルのクラス名はキャメルケースで生成されます。
テーブル名→クラス名への変換は、ActiveSupportのclassifyメソッドで行われ、クラス名→テーブル名への変換は、tableizeメソッドで行われます。
参考URL
https://techracho.bpsinc.jp/hachi8833/2017_01_11/32606
"Test_Test_1".classify
=> "TestTest1"
ここの変換はOKです。
"TestTest1".tableize
=> "test_test1s"
あれ?、test_test_1sになってくれませんでした。このようなモデル名の付け方はよくなかったのですね。クラスがありませんというエラーが出てきていた原因が判明しました。