Deviseでemailを空白でもよいようにする

やりたいこと


以下の2つを実現したい

  • ユーザー登録した場合はemailの入力は不要
  • ユーザー情報編集時、emailが空文字でも、uniqueバリデーションに引っかからないよう
  • ただし、uniqueは別なもので担保

対応方法


  1. indexの削除
  2. 別のものでuniqueを担保
  3. email判定のロジック箇所をオーバライド

indexの削除


以下のコマンドでマイグレーション用ファイルを作成する

1
$rails g migration remove_index_email_from_users

以下のように実装し、migrationを実行する

1
2
3
4
5
class RemoveIndexEmailFromUsers < ActiveRecord::Migration
  def change
    remove_index :users, column: :email, unique: true
  end
end

別のものでuniqueを担保


こちらは普通にunique制約とvalidates_uniqueness_ofを付与するのみ

とりあえずunique制約のみ

1
$rails g migration add_index_item_from_users

以下のような形でunique制約をつける

1
2
3
4
5
class AddIndexItemFromUsers < ActiveRecord::Migration
  def change
    add_index :users, :item, unique: true
  end
end

こんな感じにしておく

1
2
3
class User < ActiveRecord::Base
  validates_uniqueness_of :item
end

email判定のロジック箇所をオーバライド


emailカラムにはバリデーションが設定されているので、
これをオーバライドすることでバリデーション周りの挙動を変更できる

判定箇所を追いかけると、デフォルトで有効になっているのでここをfalseに変更する

こんな感じにしておく

1
2
3
4
5
class User < ActiveRecord::Base
  def email_required?
    false
  end
end

勿論、状況によってemail_required?が必要なこともあるのでここは要仕様検討というところでしょうか。

当たり前ですが、デカイライブラリなので、ちょっとしたことをやるだけでも結構ややこし目の実装だったりソースを読むことが必須になりますね。