前提について
はじめまして、 プログラミングスクールに通ういりふねと申します。この記事は、スクールの課題である個人アプリの開発の記録を書くことで、自身のアウトプットに利用しています。もし、読んでいただけた方がいましたら、フィードバックをしていただけたら嬉しいです。
開発するのは「有給休暇管理ツール」です。仕様は過去記事をどうぞ。
アプリはデプロイまで行いますが、サービスとして提供するものではありません。あくまでも自学習の一環ですので、ご理解下さい。では本題へどうぞ。
今回実施する内容
昨日までで、Railsで新規アプリケーションの作成、データベースの作成までは完了しました。ローカルサーバーを起動し、「localhost:3000」にアクセスしてRailsのトップ画面の表示まではなんとかできているというところからスタートです。
今回の実施内容は以下のとおりです。
- モデルファイルの作成
- deviseの導入
- マイグレーションファイルの編集と実行
- 問題なくテーブルができたらOK
エラー発生!! user_idがない!?
モデルファイルの作成、マイグレーションファイルの編集、マイグレーションの実行とほぼカリキュラムで習った内容をそのまま実施したつもりでしたが、出来上がったテーブルを見てうまく作成できていないことに気が付きました。
Branchテーブルとholidayテーブルに「user_id」のカラム表示されていないのです。この「user_id」は、Gemのdeviseで作成したuserテーブルを紐付けるためのものです。何度かロールバックしてマイグレーションファイルの編集を行ったり、再度マイグレーションを実行しても一向に変化がありませんでした。
ターミナルの内容を見ると、userテーブルがないので、user_idを外部キーとして設定できないというエラーを見つけました。いやいや、userテーブルを作るマイグレーションファイルあるじゃん。1時間位、エラー文と格闘していました。
解決!! マイグレーションは作成順に実行される
最終的にRailsガイドのこちらの記事を見て、原因が分かりました。私が、先にモデルファイルを作成し、その後でgemのdeviseを実行してマイグレーションファイルを生成していたのです。
Railsではマイグレーションの実行順序をファイル名のタイムスタンプで決定します。従って、マイグレーションを他のアプリケーションからコピーしたり、自分でマイグレーションを生成する場合は、実行順に注意する必要があります。
Railsガイドより抜粋
つまり、最後にインストールしたdeviseのマイグレーションファイルが、タイムスタンプにより最後に実行されるため、それより前に実行している「branch」や「holiday」のマイグレーションファイルに「user_id」とカラムを設定していても、そんなテーブルはない。ということになっていたようです。
簡単に解決しようとしたら!
以上の理由であれば、ファイル名を変更すれば良いのではないか?と思い、deviseから生成されたマイグレーションファイルのタイムスタンプを早い時間に書き換えました。マイグレーションをすると、再度エラー!!
ファイル名を変えたことで、変更前のマイグレーションファイルと競合を起こしているようでした。変更前のマイグレーションファイルがどうしてもロールバックできなくなり、あえなく失敗。
手順を変えて作りなおし
結局、また1時間くらい格闘しましたが、私の力ではリカバーすることができず。
再度新規アプリケーションを立ち上げて、deviseのインストールから実行することで、うまくデータベースが作成できました。ミスのリカバーまでできたら最高でしたが、開発の初期段階だったので、修正が効きました。
写真は、branchテーブルです。user_idがでました。
今日の積み上げ
- 各モデルファイルの作成前に、gem'devise'のインストールを終わらせておく。
- もし、エラーが出ても焦らず、エラー文を丁寧に読む。
- カリキュラムで手慣れていると思った工程でも、必ず手順や実施方法を確認しながら行う。