プログラミングスクールにて絶賛Railsの学習中の者です。
アプリ作成中にタイトルのようなエラーが起きたので、解決法と共に共有します。
起きたこと
ブログ機能実装の演習で、Blogという名前のアプリでBlogというモデルを作ったら、コントローラで以下のようなエラーが出ました。
NomethodError undefined method 'new' for Blog:Module
翻訳すると「モジュールとしてBlogが認識されている」となります。
(モジュールとは、クラスメソッドとは違います。複数のクラスでメソッドを共同利用できる便利さがありますが、一方でクラスのようにインスタンスの生成はできません。継承もできません。)
最初コントローラ内のnewアクション名か、周辺のコードが間違っているのかと思い確認してみました。ですがどうみてもその周辺に間違いはなさそう。
分析
調べてみると、config/application.rb の記述が確かにModule Blog
となっていました。
どうやらRailsはアプリ名をそのままモジュール名としてconfig/application.rb に自動的に生成するようです。今回の場合、アプリ名がBlog、そして rails g model
のモデル生成もBlogで行っていました。
そのため名前が混線し、このNomethodError はモジュール名が被っているせいでモデル名を呼び出せないのが原因と判明しました。アプリ名とモデル名は同じにしてはならないということです。
解決まで
以上の原因のため、アプリ名を変更すれば解決します。
具体的には下記の方法がありました。
- アプリを作り直す(推奨)
-
rename
のGemを使ってアプリ名を変更する
基本的には1を推奨します。
ですがせっかくなので、今回は「もしアプリを消せない状況だったらどうするか」と仮定してrenameを使用してみました。これについては参考記事に詳細が書いてありますので、そちらを紹介します。
[Rails]rails newした後からアプリ名を変更する方法
結論から言うとrenameでアプリ名、つまりモジュール名を変更することには成功しました。が、やはり手動で細かい所を直す必要が多少あり、労力を考えるとやはりそもそも作り直す方が個人制作の上では速いと感じました。
アプリケーション名の命名規則
Railsの命名規則は厳しいと聞いていたので、ではアプリ名にも規則があるのか?と講師に確認してみました。
結論としては「無い」とのことです。大文字小文字やハイフン、_のどれを使うかといった決まりは無い。ただし今回のようにモデル名と同じにしてしまうとエラーが出てしまうので、そこだけ気を付けるべし、と教わりました。
終わりに
最初エラーを見た時はまさかアプリ名が原因とは思わなかったので、良い経験になりました。今後はもう同じエラーは起こさないと思います。
ここまで読んでくださり、ありがとうございました。