概要
- 既にテーブル users を作成していたため後から devise を導入する形で作業を進行しました
- 最初から作成する場合の記事が多かったですが既存の場合はどうなるのか気になったため実行
【結論】後から導入する場合にも問題ない
- 既存のテーブルを削除して作り直す必要もない
実際に行った手順
- 当然ではありますが公式の手順書を確認しながら作業を進行しました
bundle add devise
rails generate devise:install
肝心の既存のテーブルに関わってくる箇所
- ここでモデル名を指定するコマンドが登場します
rails generate devise MODEL
- 私の場合は既存の User モデルに devise の認証を追加したかったので次のようにしました
rails generate devise User
- 既存のモデルに対して追記がされるため問題なく導入できました
ところが rails db:migrate
で詰まった
- この後生成されたマイグレーションファイルを
rails db:migrate
したところでエラーとなった
実際に表示されたエラー
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_email" DETAIL: Key (email)=() already exists.
確認した事・試したこと
-
email
というカラムが原因なのかと思いスキーマを確認した- そもそも既存のテーブルには
email
のカラムを作成していないので関係が無いと判断
- そもそも既存のテーブルには
- データベースを作り直したら直ったという旨が確認できたので
rails db:reset
を実行- しかし同じエラーが表示される
解決策
- なぜこれで解決できるのかが全く分かっていないため今後の課題とする
- こちらにある通り、
tests/fixtures/users.yml
を編集したら、エラー無くrails db:migrate
を実行できた
以下、私の場合を示す
-
one
、two
にそれぞれ値の異なるemail
カラムを追加した
tests/fixtures/users.yml
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
user_uid: MyString
email: alice@example.com
profile_image: MyString
name: MyString
gender: 1
age: 1
introduction: MyText
two:
user_uid: MyString
email: bob@example.com
profile_image: MyString
name: MyString
gender: 1
age: 1
introduction: MyText
参考資料