RailsでDeviseのセッティング中にmigrationファイルを作成しrails db:migrate
(またはrake db:migrate
)を実行したところ以下エラーが発生した。これの対処法について。
/app # rails db:migrate
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:
class AddConfirmableToDevise < ActiveRecord::Migration[4.2]
##対処法
migrationファイルの継承したクラス名の末尾でRailsのバージョンを指定する必要がある。Rials6の場合は[6.0]
を追記する。
class AddConfirmableToDevise < ActiveRecord::Migration[6.0]
処理
end
再度、rails db:migrate
を実行。
# rails db:migrate
== 20210415115443 AddConfirmableToDevise: migrating ===========================
-- add_column(:users, :confirmation_token, :string)
-> 0.0048s
-- add_column(:users, :confirmed_at, :datetime)
-> 0.0023s
-- add_column(:users, :confirmation_sent_at, :datetime)
-> 0.0019s
-- add_index(:users, :confirmation_token, {:unique=>true})
-> 0.0048s
== 20210415115443 AddConfirmableToDevise: migrated (0.0214s) ==================
無事migrationが成功。
##エラーの詳細 表示されたエラー内容を見ると
Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:
class AddConfirmableToDevise < ActiveRecord::Migration[4.2]
クラスActiveRecord::Migrationの直接の継承はサポートされていない。バージョンを指定してください。
例 class AddConfirmableToDevise < ActiveRecord::Migration[4.2]
という記述が書いてある。
つまり、マイグレーションファイルでクラスを継承する場合は、バージョンの指定が必須ということ。
##補足 なお、今回はdeviseにconfirmableモジュールを追加するため後からマイグレーションファイルを追加作成したが、初期の`$ rails g devise モデル名`で自動生成されたマイグレーションファイルにはきちんとバージョンが記載されている。
class DeviseCreateモデル名複数形 < ActiveRecord::Migration[6.0]
処理
end