devise導入後のmigrateエラー
エラー文章
BLOB/TEXT column 'profile' can't have a default value
###1.実行環境
Ruby 2.6.5
Rails 6.0.0
DB mysql
2.エラーまでの実際の処理手順
1.railsのGemにdeviseを記述 gem 'devise'
2.ターミナルで実行bundle install
3.devise関係のファイルを生成。ターミナルで実行rails g devise:install
4.ユーザーモデルの作成。ターミナルで実行rails g devise user
5.テーブル設計のため、migrationファイルに追加カラムを記述
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.string :name, null: false, default: ""
t.text :profile, null: false, default: ""
t.text :occupation, null: false, default: ""
t.text :position, null: false, default: ""
6.アプリケーションコントローラーに追加カラムのストロングパラメーターを記述。
deviseの場合はdevise_parameter_sanitizerメソッド
を使用する。
メソッド名はconfigure_paramitted_parameters
にするのが通例だが、別名でも可。
これにより、deviseからの新規登録やログイン時のリクエストでパラメーターを受け取れるようになる。
※emailとパスワードはデフォルトで設定されるので記述不要。
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :profile, :occupation, :position])
end
end
7.migrateを実行
ここでエラーになる!
% rails db:migrate
== 20210513005253 DeviseCreateUsers: migrating ================================
-- create_table(:users)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:
Mysql2::Error: BLOB/TEXT column 'profile' can't have a default value
3.エラー理由はなに?
ここまでの流れでなぜエラーになるのかが分かりません。
なぜなら、ほぼ同じ流れで別のアプリのユーザーログイン機能を実装したからです。
ここで疑わしいのはエラー文の一番下。
Mysql2::Error: BLOB/TEXT column 'profile' can't have a default value
profile
しかし、見直しても変なところが見つかりません。
4.Google先生に聞く!
すると、こんな記事が見つかりました。
そうdeviseのデフォルトにエラー理由があったようです。
もう一つ参考記事
どうやらバージョンが変わるにつれて過去の記述の方法だとエラーになってしまうらしい。
今回で言うとtext型のカラムにdefaultを設定するのはエラーだそうです。
そこで、追加カラム分のdefault: “”
を削除します。
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.string :name, null: false, default: ""
t.text :profile, null: false
t.text :occupation, null: false
t.text :position, null: false
これでmigrateを実行しますが・・・
エラーになりました!
5.deviseのprivateメソッド
続いてのエラーを探るとprivateメソッドにも問題があるようです。
これもバージョン変更によるものなのか、
デフォルトで設定されるはずの”password”もprivateメソッドに記述することでエラーが解消できました。
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:password, :password_confirmation, :name, :profile, :occupation, :position])
end
これで無事に
rails db:migrate
が実行され、データベースに追加カラムも含めたUsersテーブルができました。
6.devise導入時のエラーポイント
・text型のカラムにdefaultの設定をするとエラーになるかも!
・privateメソッドの記述ではデフォルトのはずのpasswordも追加記述をする必要があるかも!