2011-08-17 13 views
17

Configuré Devise para iniciar sesión con un nombre de usuario en lugar de una dirección de correo electrónico porque un número significativo de nuestros usuarios comparte la misma dirección de correo electrónico con su cónyuge. Es un mercado único al que servimos. Pero cada cónyuge necesita cuentas separadas para registrar los resultados de los instrumentos de personalidad.Idear cómo cambiar la configuración para que las direcciones de correo electrónico no tengan que ser únicas

La base de datos ya no requiere una dirección de correo electrónico única, por lo que aceptará el mismo correo electrónico addy para dos cuentas. Sin embargo, Devise aún requiere una dirección de correo electrónico única para cada cuenta. ¿Existe un entorno o un trabajo que pueda usar para cambiar esto?

Respuesta

13

Mire en el config/initializers/devise.rb. Puede cambiar la clave de autenticación predeterminado, que por defecto es :email a ser cualquier cosa que desee, por ejemplo:

config.authentication_keys = [ :username ]

+0

Ya lo hice. Devise aún requiere una dirección de correo electrónico única. Gracias por tu iniciativa. – Jay

+6

En ese caso, elimine: validable del modelo y debería estar bien. Agregue sus propias validaciones personalizadas si es necesario. – eugen

+12

Desafortunadamente al eliminar ': validatable' se eliminan muchas otras cosas útiles, p. validación de contraseña. En versiones recientes de Devise también puede implementar 'email_required?' En su modelo. Esto saltará la validación del correo electrónico si se devuelve 'falso ', vea https://github.com/plataformatec/devise/pull/545 – malclocke

-1

lo tanto, esto es muy viejo, pero ... Pensé que respondería.

estoy usando una versión antigua de legado (1.4.9), pero, a través de un poco de ayuda en #rubyonrails en freenode, he encontrado que hay que editar el lib/diseñar/modelos/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 

Esto también requiere ir a la base de datos y cambiar el índice en la columna de correo electrónico, que se establece como único fuera de la caja.

42

= Usuario Modelo

def email_required? 
    false 
end 

def email_changed? 
    false 
end 

= Migración

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

Esto es lo que funcionó para mí. ¡Aclamaciones! – asgeo1

+1

lo que Erik Jacobs escribe a continuación validó este enfoque, ya que la validación que comentó puede ser deshabilitada por 'email_changed?'. Yo ligeramente prefiero lo que Moin Haidar hizo aquí, ya que no es necesario editar el código Devise de esta manera. – semiomant

+1

La migración puede ser: 'remove_index: users,: email' –

0

Si sólo desea eliminar uniqueness validation propuesta por el devise y mantener a los otros, se refieren this (por rails> = 4.1.6) .

Cuestiones relacionadas