Izinkan beberapa pengguna dengan email yang sama dengan Rancangan Token Auth

Saya ingin mengizinkan beberapa pengguna dengan email yang sama untuk dibuat, menggunakan devise-token-auth .

Daripada kesalahan ini terjadi.

@details={:email=>[{:error=>:taken, :value=>"[email protected]"}]}>

Saya berharap menghapus devise :validatable dari user.rb akan berhasil, tetapi ternyata tidak.

pengguna.rb

class User < ActiveRecord::Base
  extend Devise::Models
  include DeviseTokenAuth::Concerns::User
  
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable
end

Saya menemukan pertanyaan SO serupa dari tahun lalu, tetapi sarannya tidak berhasil.

Saya bertanya-tanya apakah ini secara khusus merupakan masalah rancangan-token-auth, bukan rancangan.

Adakah yang pernah memecahkan ini sebelumnya?


person tim_xyz    schedule 20.08.2020    source sumber


Jawaban (1)


Saya hanya dapat menemukan cara hacky untuk mencapai hal ini sejauh ini, dan ingin berbagi.

Mengingat tampaknya tidak ada cara sederhana untuk melakukan hal ini.

Saya harus mengatur metode provider dari DeviseTokenAuth::Concerns::ResourceFinder ke nil. Standarnya adalah hardcode "email".

    def provider
      nil
    end

Jadi ketika build_resource dipanggil di registrations_controller.rb, itu tidak akan otomatis menyetel provider="email".

Tanpa provider="email", kesalahan Email sudah diambil tidak lagi muncul.

    def build_resource
      @resource            = resource_class.new(sign_up_params)
      @resource.provider   = provider

      # honor devise configuration for case_insensitive_keys
      if resource_class.case_insensitive_keys.include?(:email)
        @resource.email = sign_up_params[:email].try(:downcase)
      else
        @resource.email = sign_up_params[:email]
      end
    end

Namun dengan mengubah logika di atas, uid tidak lagi diperbarui dengan nilai email pengguna. Jadi saya menambahkan panggilan balik pada User.rb sebagai kompensasi.

  after_initialize do
    self.uid = self.email
  end

Ini berhasil, tetapi saya ingin cara yang lebih sederhana untuk mencapainya.

person tim_xyz    schedule 21.08.2020