LoginSignup
0
0

model作成時にrails db:migrateを実行しようとしたらundefined method `stiring'とエラーが出たのでその解決に至るまでをアウトプットする

Last updated at Posted at 2023-08-21

やりたかったこと

アプリケーションを作成するにあたり、userの情報を格納するためのusersテーブルが必要になったので以下のようにコマンドを打ち込んでmodelとマイグレーションファイルとRSpec用のモデルスペックファイルとFactory Bot用のファクトリファイル作成しようとした。

rails g model User name:stiring email:string password_digest:string

その後、DBに反映させるためにrails db:migrateを実行したら以下のようなエラーが出た

StandardError: An error has occurred, this and all later migrations canceled:
undefined method `stiring' エラー文が続く...

解決までの道のり

1.エラー文の解読

上記のエラー文をよく見てみると、自分のタイピングミスでstiringなんてメソッド(今回の場合は、データ型)は存在しないよとおこられた。

2.migrationのステータスの確認とファイルの削除

そのマイグレーションファイルを削除するためにまずは、downになっていることを確認しようと思ってrails db:migrate:statusでマイグレーションファイルの状況を確認すると以下のようになっていた

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20230815080323  Create tasks
   up     20230817012833  Add expiry date to tasks
   up     20230817014502  Remove expiry date from tasks
   up     20230817023012  Add expired at to tasks
   up     20230817062638  Add status to tasks
   up     20230819041152  Add priority to tasks
   up     20230819144335  Add index tasksnot started yet
   up     20230819144533  Remove not started yet to tasks
   up     20230819144709  Add index tasks not started yet
  down    20230821015454  Create users

まだ、rails db:migrate実行前なのでdownになっていた。本来なら、ファイルがdown状態の時はマイグレーションファイルに直接書き込み、stiringをstringに訂正して、再度rails db:migrateを実行すればよかったのだが、自分がマイグレーションファイルの理解があまりできていなかったので、失敗したらファイルがdownになっているのを確認してからrmコマンドでファイルを消た。

再度rails g model とrails db:migrateを実行

stringに綴りのところに気をつけながら、再度、rails g model User name:string email:string password_digest:stringを実行し、その後、rails db:migrateを実行すると以下のようにschemaに無事に反映された。

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.string "password_digest"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

まとめ

・マイグレーションファイルがdown状態の時は、直接、マイグレーションファイルに書き込んで変更しても良い。
・マイグレーションファイルをupからdownにする方法は以下の通り
1.rails db:migrate:statusで状況の確認及びdownさせたいマイグレーションファイルのidを取得する
2.rails db:migrate:down VERSION=downさせたいマイグレーションファイルのid番号でdownさせる
3.訂正が終わったら、rails :db:migrateでupさせ、schemaファイルに反映されているかを確認する

3.おまけconflictとforceについて

rails g model User name:string email:string password_digest:stringを再度実行した時にターミナルには以下のように表示されたスクリーンショット 2023-08-21 13.24.30.png
この時に赤文字で表示された赤文字のconflictと黄色文字のforceが気になったので調べてみた結果を以下のようにまとめてみた。
conflict:前にタイピングミスでrails g model実行時に生成されたRSpec用のモデルスペックファイルとFactory Bot用のファクトリファイルがすでに存在しており、今回正しい表記でrails g modelをした際に作られたRSpec用のモデルスペックファイルとFactory Bot用のファクトリファイルが再度生成され、それぞれが競合(conflict)が発生しています。という意味での赤文字での警告だった
その下にあるOverwriteのところで上書きしますか?みたいな表記でenterを押した
force:enterを押したことで強制的に後者で作られたRSpec用のモデルスペックファイルとFactory Bot用のファクトリファイルの内容に上書きしたという意味。

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