1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails gem 'devise' のmigrateエラー

Last updated at Posted at 2021-05-22

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ファイルに追加カラムを記述

20210513023545_devise_create_users.rb
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とパスワードはデフォルトで設定されるので記述不要。

application_controller.rb
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: “”を削除します。

20210513023545_devise_create_users.rb
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メソッドに記述することでエラーが解消できました。

application_controller.rb
  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も追加記述をする必要があるかも!

1
1
1

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?