railsにsorceryを導入した時に公式wiki通りにやったらハマった話
プログラミングを本格的にスタートして5ヶ月目に入りましたさかもとです。
今回はrailsにuser管理機能を実装するためにsorceryを導入した時にハマった話をアウトプットしていこうと思います。
sorceryって
sorceryは簡単にプロダクトの中にuser管理機能を導入することのできるgemです。
具体的にはgemをインストールして公式のwiki通りに進めるとuser新規登録機能とuserログイン機能に必要なモデルやマイグレーションファイル、その他いくつかの設定ファイルが作成され手間をかけずにuser周りの操作が実装できます。
これが公式wikiです。
Simple Password Authentication · Sorcery/sorcery Wiki · GitHub
この後はこの通りに進めていくので一読していただけると内容がわかりやすいと思います。
実装
① gemのインストール
gem 'sorcery'をgemファイルの中に入れbundleします。
② sorceryを実行
rails g sorcery:installで必要なファイル等も作成します。
するとdbにモデルを作成するためもととなるファイルが大きく2つ作成されます。
migrateファイル
user.rb
③ rails db:migrate
設定やvalidatesの書き込みなどあると思いますが今回はwikiの流れにそうのでここでmigrateします。
④ viewの実装
新規登録画面を実装します。
nameカラムを追加してbootstrapで装飾してますがほとんどwiki通りだと思います。
⑤ ブラウザで確認
最後にブラウザで新規登録できるか確認してみましょう。
?????????????????
これが今回、私がハマったエラーです。
思考
今回は公式は正しいと思い込んでしまいエラーをよくみなかったのが時間を取られてしまった大きな要因だったと反省しています。
例によって例のごとくエラーからざっくり内容を予測します。
ActiveRecord::StatementInvalid - Mysql2::Error:Table'mentalhealth_management_test_development.users' doesn't exist:
form_withで使うためにuserインスタンスをUser.newで作成しているところで起きています。内容はusersテーブルがMysqlの中に存在しないよと言っていると考えました。
予測を立てたのでschema.rbファイルを確認しにいきます。
テーブルは作成されていました。
ただテーブル名はUser ....ちょっと変です。
次にテーブルのもととなるマイグレーションファイルを見に行きます。
ここが原因でした。
sorceryで自動生成されたものですが本来テーブルは複数形で記載する必要があります。
ここがUserになっているせいでusersテーブルがないと言われてしまっていたのです。
解決
マイグレーションファイルを本来の形に修正しました。
emailに重複を避けるためにvalidatesでuniqueが貼られているのでadd_indexの記述も変更しました。
私はここの変更を忘れて半日はまりました。
これでrails db:migrateすると無事レンダリングすることができました。
最後に
公式は正しいと思い込み何か見落としたことがあるのではと実装順序を目をさらにして確認してしまいました。
エラーに真摯に向き合うことが大切だと学びました。
今後もエラーについてまとめていこうと思います。