Ruby on rails を学習中の方の参考にしてもらえたら嬉しいです。
アプリケーションを作成している時に出てくるエラーとその解決方法について掲載します。少しでも参考にしていただけると幸いです。
今回はundefined method 'devise' for User:Classというエラーの解決方法をお話しします。
1、今回のエラー画面はこれです
今回はuserテーブルをdeviseを使ってuserテーブルに同時にdeviseも書き入れようとしました。下記の画像のようにrails generate devise User
を作ろうとした際に起きたエラーを解決していきます。
2、結論はこちら
と言うことで、model > user.rb と言うモデルを作成していたのですが、その中の記載に extend Devise::Models
と言う記述をすることで解決できました。
その解決プロセスについて話してみたいと思います。
3、実装したかったもの
今回のエラーになったところでは下の画像のようにdeviseを入れてからTweetsテーブルを作成しようとしましたが、その際にrails db:migrate
が実行できませんでした。(ターミナルの画像のようにrails aborted!
と表示されてしまいます。
実は上記の手順に問題がありました。実際にはuserテーブルを先に作らないとtweetsテーブルはマイグレーションされませんでした。
この、マイグレーションができないエラーを解決してしていきます。
4、ChatGPTにエラーの原因を聞きます
まずは上記画像の上から三行のところに『ユーザーを作らないといけない』と言うことが分かります。
次に、tweetsテーブルにuserテーブルの参照を行う設定としてbelongs_to :user
が定義されていました。
なので、この上記の画像の助言の通りuserテーブルを作ります。userテーブルはdeviseと同時に作りたかったので、 rails generate devise User
と言うコマンドで、userテーブルを作っていきます。
この順序で行うとtweetsテーブルの方が先に読み込まれるようになってしまうので、userテーブルが先に来るようにファイル名の数字をいじりました。
これでuserテーブルが読み込まれ、後からtweetsテーブルが読み込まれるようになるのでマイグレーションがうまくいくと書いてあります。
5、上記で解決しない場合。
上記のようにマイグレーションファイルの順序を入れ替えてrails db:migrate
をしてもマイグレーションができない場合には他にも行うことがあります。
それはextend Devise::Models
を入力すると言うことです。
これはQiitaの別の記事を参考にしました。ユーザーモデルにextend Devise::Modelsを入力してマイグレーションをかけると完了します
ターミナルでマイグレーションができたことが確認できたので、モデルとコントローラーとビューを記述してブラウザを表示させてみると↓
と、このようにエラー画面が消えました。
じゃあ、このextend Devise:Modelsってなんだったんだ?
6、extend Devise:Modelsとは?
このextend Devise:Models
とは何か?これについてもChatGPTに聞いておきました。
と言うことで、最後の段落にも書いてありますが、明示的に書く必要はなく、本来はいらないコードで、何かの動作に問題があったので、記述した。と言うことなので、イレギュラーに対処したということになります。
この先、コードを追加して行った時に、このextend Devise:Modelsが他と干渉しなければいいなと不安な部分もありましたが、先に進むことにします。
いかがでしたでしょうか?
他にも記事を発信していきますので、私の QiitaやTwitterをフォローしていただけると嬉しいです。
個別の質問もぜひ歓迎します。
私自身、初学者ではありますが、1歩先を行くものとして回答できたらと思います。
それでは。