LoginSignup
0
0

【解決方法】undefined method 'devise' for User:Class とは?

Posted at

Ruby on rails を学習中の方の参考にしてもらえたら嬉しいです。
アプリケーションを作成している時に出てくるエラーとその解決方法について掲載します。少しでも参考にしていただけると幸いです。
今回はundefined method 'devise' for User:Classというエラーの解決方法をお話しします。

1、今回のエラー画面はこれです

スクリーンショット 2023-07-07 6.56.11.png
今回はuserテーブルをdeviseを使ってuserテーブルに同時にdeviseも書き入れようとしました。下記の画像のようにrails generate devise Userを作ろうとした際に起きたエラーを解決していきます。
スクリーンショット 2023-07-07 6.27.55.png

2、結論はこちら

スクリーンショット 2023-07-07 6.59.50.png
と言うことで、model > user.rb と言うモデルを作成していたのですが、その中の記載に extend Devise::Modelsと言う記述をすることで解決できました。
その解決プロセスについて話してみたいと思います。

3、実装したかったもの

今回のエラーになったところでは下の画像のようにdeviseを入れてからTweetsテーブルを作成しようとしましたが、その際にrails db:migrateが実行できませんでした。(ターミナルの画像のようにrails aborted!と表示されてしまいます。
スクリーンショット 2023-07-07 6.27.55.png
スクリーンショット 2023-07-07 6.33.10.png

スクリーンショット 2023-07-07 6.30.32.png
実は上記の手順に問題がありました。実際にはuserテーブルを先に作らないとtweetsテーブルはマイグレーションされませんでした。
この、マイグレーションができないエラーを解決してしていきます。

4、ChatGPTにエラーの原因を聞きます

スクリーンショット 2023-07-07 6.33.41.png
まずは上記画像の上から三行のところに『ユーザーを作らないといけない』と言うことが分かります。
次に、tweetsテーブルにuserテーブルの参照を行う設定としてbelongs_to :userが定義されていました。
なので、この上記の画像の助言の通りuserテーブルを作ります。userテーブルはdeviseと同時に作りたかったので、 rails generate devise Userと言うコマンドで、userテーブルを作っていきます。
この順序で行うとtweetsテーブルの方が先に読み込まれるようになってしまうので、userテーブルが先に来るようにファイル名の数字をいじりました。
スクリーンショット 2023-07-08 5.36.08.png
これでuserテーブルが読み込まれ、後からtweetsテーブルが読み込まれるようになるのでマイグレーションがうまくいくと書いてあります。

5、上記で解決しない場合。

上記のようにマイグレーションファイルの順序を入れ替えてrails db:migrateをしてもマイグレーションができない場合には他にも行うことがあります。
それはextend Devise::Modelsを入力すると言うことです。
スクリーンショット 2023-07-08 4.58.52.png
これはQiitaの別の記事を参考にしました。ユーザーモデルにextend Devise::Modelsを入力してマイグレーションをかけると完了します

このようにターミナルから完了したことが確認できます。
スクリーンショット 2023-07-07 6.44.28.png

ターミナルでマイグレーションができたことが確認できたので、モデルとコントローラーとビューを記述してブラウザを表示させてみると↓
スクリーンショット 2023-07-07 6.59.57.png
と、このようにエラー画面が消えました。
じゃあ、このextend Devise:Modelsってなんだったんだ?

6、extend Devise:Modelsとは?

このextend Devise:Modelsとは何か?これについてもChatGPTに聞いておきました。
スクリーンショット 2023-07-07 6.59.50.png

と言うことで、最後の段落にも書いてありますが、明示的に書く必要はなく、本来はいらないコードで、何かの動作に問題があったので、記述した。と言うことなので、イレギュラーに対処したということになります。
この先、コードを追加して行った時に、このextend Devise:Modelsが他と干渉しなければいいなと不安な部分もありましたが、先に進むことにします。

いかがでしたでしょうか?
他にも記事を発信していきますので、私の QiitaやTwitterをフォローしていただけると嬉しいです。
個別の質問もぜひ歓迎します。
私自身、初学者ではありますが、1歩先を行くものとして回答できたらと思います。
それでは。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0