2011-08-17 6 views
17

Ho configurato Devise per accedere con un nome utente invece di un indirizzo email perché un numero significativo di nostri utenti condivide lo stesso indirizzo email con il loro coniuge. È un mercato unico che serviamo. Ma ogni coniuge ha bisogno di account separati per registrare i risultati degli strumenti della personalità.Devise - come modificare le impostazioni in modo che gli indirizzi di posta elettronica non debbano essere univoci

Il database non richiede più un indirizzo di posta elettronica univoco, pertanto accetta lo stesso indirizzo di posta elettronica per due account. Tuttavia, Devise richiede ancora un indirizzo email univoco per ogni account. C'è un ambiente o un lavoro che posso usare per cambiare questo?

risposta

13

Cerca nello config/initializers/devise.rb. È possibile modificare la chiave di autenticazione di default, che di default è :email di essere tutto quello che vuoi, per esempio:

config.authentication_keys = [ :username ]

+0

L'ho già fatto. Devise sta ancora richiedendo un indirizzo email unico. Grazie per la tua iniziativa però. – Jay

+6

In tal caso, rimuovere: validatable dal modello e si dovrebbe andare bene. Aggiungi le tue convalide personalizzate se necessario. – eugen

+12

Purtroppo la rimozione di ': validatable' rimuove molte altre cose utili, ad es. convalida della password. Nelle versioni recenti di Devise puoi anche implementare 'email_required?' Sul tuo modello. Questo salterà la convalida dell'e-mail se viene restituito 'false', vedere https://github.com/plataformatec/devise/pull/545 – malclocke

-1

Quindi, questo è veramente vecchio ... ma Ho pensato di rispondere.

Sto usando una vecchia versione di concepire (1.4.9), ma, attraverso qualche aiuto in #rubyonrails su freenode, ho scoperto che è necessario modificare il lib/ideare/modelli/validatable.rb:

module Devise 
    module Models 
    module Validatable 
     # All validations used by this module. 
     VALIDATIONS = [ :validates_presence_of, :validates_uniqueness_of, :validates_format_of, 
         :validates_confirmation_of, :validates_length_of ].freeze 

     def self.included(base) 
     base.extend ClassMethods 
     assert_validations_api!(base) 

     base.class_eval do 
      validates_presence_of :email, :if => :email_required? 
      # commented out so that we don't check for unique emails 
      #validates_uniqueness_of :email, :case_sensitive => (case_insensitive_keys != false), :allow_blank => true, :if => :email_changed? 
      validates_format_of :email, :with => email_regexp, :allow_blank => true, :if => :email_changed? 

      validates_presence_of :password, :if => :password_required? 
      validates_confirmation_of :password, :if => :password_required? 
      validates_length_of :password, :within => password_length, :allow_blank => true 
     end 
     end 
    end 
    end 
end 

Ciò ha richiesto anche l'accesso al database e la modifica dell'indice nella colonna di posta elettronica, che è impostato su univoco senza schemi.

42

= utente modello

def email_required? 
    false 
end 

def email_changed? 
    false 
end 

= Migrazione

rails g migration update_index_on_users 
def up 
    sql = 'DROP INDEX index_users_on_email' 
    sql << ' ON users' if Rails.env == 'production' # Heroku pg 
    ActiveRecord::Base.connection.execute(sql) 
end 
+0

Questo è ciò che ha funzionato per me. Saluti! – asgeo1

+1

ciò che Erik Jacobs scrive sotto convalidato questo approccio, poiché la convalida che ha commentato può essere disabilitata da 'email_changed?'. Preferisco leggermente ciò che Moin Haidar ha fatto qui, dal momento che non è necessario modificare il codice Devise in questo modo. – semiomant

+1

La migrazione può essere: 'remove_index: users,: email' –

0

Se solo si desidera rimuovere uniqueness validation proposta dal devise e tenere gli altri, fare riferimento this (per rails> = 4.1.6) .

Problemi correlati