質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1994閲覧

Railsでuninitialized constant userエラーが発生してしまう

bardy

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/10/07 11:41

編集2021/10/08 05:18

railsでrails g model userとコマンドを入力すると、上記エラーが出ます。
###経緯
devise_token_authを使って開発しています。
既存のテーブルカラムとのダブりを直そうとrails db:rollbackを何回か繰り返したところ、usersテーブルごと消えてしまいました。
そこで、元々あったuserモデルをrails destroyで削除し、rails g model userをしましたが、エラーが発生しました。
また、手動で作ろうとrails g migration usersを行いましたが同じエラーが出ます。

調べたところ、ファイル名とクラス名が一致していないのが原因のようですが、クラス名というのはコントローラーのことなんでしょうか。

初学者なので、初歩的な質問かもしれないですが、解決できる方おられますでしょうか。
他にソースコードが必要であれば追加致します。

#users_controller.rb module Api module V1 class UsersController < ApplicationController def create user = User.create(user_params) if user.save render json: {text: 'succes', status: 200, data: user} else render json: {text: 'error', status: 500, data: user.errors } end end private def user_params params.require(:user).permit(:name, :user_id, :email, :password) end end end end
#api/db/migrate/20211006114511_devise_token_auth_create_users.rb class DeviseTokenAuthCreateUsers < ActiveRecord::Migration[5.2] def change change_table(:users) do |t| ## Required t.string :provider, :null => false, :default => "email" t.string :uid, :null => false, :default => "" ## Database authenticatable t.string :encrypted_password, :null => false, :default => "" ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at t.boolean :allow_password_change, :default => false ## Rememberable t.datetime :remember_created_at # 追記 -------------------------------------------- ## Trackable t.integer :sign_in_count, default: 0, null: false t.datetime :current_sign_in_at t.datetime :last_sign_in_at t.string :current_sign_in_ip t.string :last_sign_in_ip # ----------------------------------------------------- ## Confirmable t.string :confirmation_token t.datetime :confirmed_at t.datetime :confirmation_sent_at t.string :unconfirmed_email # Only if using reconfirmable ## Lockable # t.integer :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts # t.string :unlock_token # Only if unlock strategy is :email or :both # t.datetime :locked_at ## User Info # t.string :name # t.string :nickname t.string :image # t.string :email ## Tokens t.text :tokens t.timestamps end add_index :users, :email, unique: true add_index :users, [:uid, :provider], unique: true add_index :users, :reset_password_token, unique: true add_index :users, :confirmation_token, unique: true # add_index :users, :unlock_token, unique: true end end
#api/db/migrate/20211007175252_create_users.rb class CreateUsers < ActiveRecord::Migration[5.2] def change create_table :users do |t| t.string :name t.string :user_id t.string :email t.string :password t.timestamps end end end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

databaseの方は、(現時点では重要なデータが入っているとは思えないので)
rails db:droprails db:createrails db:migration で作り直しましょう。
ただ、uninitialized constant userが出ているとそれもできないかと思います。
Deviseを使っているようなので、場合によってはちと厄介です。
app/models に user.rb はありますか? そこに class User の定義がありますか?
もしくは、class User の定義のあったFileの名前を変えたりしていませんか?
app/models/user.rb で class User の定義があるようにしてください。
git で管理していたら、 git checkout app/models/user.rb で復元できるかも。

それらができないときは、Deviseのコマンドでuserを作ったかと思いますが、そこからやりなおしです。

投稿2021/10/07 23:06

winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bardy

2021/10/08 03:32

回答ありがとうございます。 下記の記事のようにしたところ、userモデルを作成することができました。 https://mebee.info/2021/01/09/post-27692/ *自分の場合、「devise_for: users」ではなく「mount_devise_token_auth_for 'User', at: 'auth'」のみだったのでこれをコメントアウトしました。 devise:installでエラーが出ていたまま、インストール出来ておらず、devise コマンドはまだ使っておりません。 databeseに関しては、今回のエラーが発生する前にrails db:resetしているのですが、上記で仰ったようにrails db:dropからすれば良いんでしょうか。mysqlで確認すると、databaseはあって、usersテーブルは無い状態でした。 それと、rails g devise:installをすると、 conflict config/initializers/devise.rb Overwrite /Users/ユーザー名/myapp/api/config/initializers/devise.rb? (enter "h" for help) [Ynaqdhm] と出てきたのですが、これはどう対応すれば良いでしょうか。
winterboum

2021/10/08 03:47

db:reset は db/migrate にしたがって作ってくれるわけではないので、migrate 通りに作るには、dropしてcreateしてmigrateするのが確実です
winterboum

2021/10/08 03:49

編集してあれば no ですが、でなければとりあえず Yes で良いでしょう。
bardy

2021/10/08 05:29

conflictはYとして完了しました。 userモデルに関してなのですが、既存のuserモデルがある場合の方法として2通りありました。 ①https://qiita.com/DaichiSaito/items/b6239d70ab10b2070bc4 ②https://qiita.com/beanzou/items/c315889abae255a4266c どちらが正しいのでしょうか。 今のmigrationファイルの状態を本文に追加しておきました。まだrails db:migrateはしておりません。
winterboum

2021/10/08 05:56

どちらが正しいかというのは状況によるのでなんとも。 載せていただいたmigrationきちんと読んでませんが(それに1つ目のcreateがないし)新しいcreateで定義されている項目がすでにあれば、migrationを消す。 新しい項目が有ったら、それが必要なら create でなく add_columnなどに変える。 判断できなかったらとりあえず追加かなぁ とっても基本的なこうもくだから、すでにあると思いますが
bardy

2021/10/08 07:27

確かに、前のuserモデルは消したので、devise_token_authのモデルに直接項目を書けますね。勘違いしてました。 それで進めていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問