凡ミスでmigrate出来なかった時のお話
上記の5段構成で進めていきます。
本題に急いでいる方は
本題のerror発生から飛んで下さい。
以降、一部補足をしながら進めていきます。
rails g modelコマンド
rails g modelコマンド
でモデルを作成したとき、
db/migrate/ディレクトリにmigrationファイルが同時に生成
される。
migrationファイルの中身はこんな感じ
class Createモデル名の複数形 < ActiveRecord::Migration[6.0]
def change
create_table :モデル名の複数形 do |t|
t.timestamps
end
end
end
% rails g model 単数形モデル名
generateの略で、生成するの意味がある。
基本的に、コントローラー名は複数形、モデル名はそれに対応する単語の単数形になる。
補足情報 :
% rails d model 単数形モデル名
destroyの略で、削除するの意味がある。
rails db:migrateコマンド
migrationファイルにデータベースに保存したいカラムの型とカラム名を指定
して、
% rails db:migrate
とコマンドを打ち込みmigrationを実行する流れになるのだが...
% rails db:migrate
この動作は、マイグレートと呼ばれることがある。
migrationが実行できない
migrationが実行できず、ターミナルには以下のerror文が...
== 20210119052352 CreateAddresses: migrating ==================================
-- create_table(:addresses)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:
undefined method `steing' for #<ActiveRecord::ConnectionAdapters::MySQL::TableDefinition:0x00007fbc8955f760>
Did you mean? string
~~省略~~
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Caused by:
NoMethodError: undefined method `steing' for #<ActiveRecord::ConnectionAdapters::MySQL::TableDefinition:0x00007fbc8955f760>
NoMethodError: undefined method `steing'
~~省略~~
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
errorの仮設・検証スタート
長々と出てきましたが、現状の私が着目したのは以下の3点
1. StandardError: An error has occurred, all later migrations canceled:`
2. undefined method `steing' for #
3. Did you mean? string
カラムの型を指定した際に手打ちしていた事によってスペルミスの可能性が浮上してきました。
追求はしませんでしたが、StandardError
とある上記のerror文に関しても
こうして整理していくと気になってくる。
検索結果 :
rails db:migrate:reset
データベースのリセットを行ってerror解決している記事を発見。
だが、今回の場合Did you mean? string
の表記が
決め手になっていた様に捉えて間違いなかったようだ。
解決
この後migrationファイルを見直して予想通りsteing
を発見。
== 20210119052352 Createモデル名の複数形: migrating ==================================
-- create_table(:モデル名の複数形)
-> 0.3171s
== 20210119052352 CreateAddresses: migrated (0.3174s) =========================
無事migration完了
もし仮にカラム名を間違っていたらerrorも吐かれずrollbackしていた事でしょう。