2010-05-08 7 views
39

Sto utilizzando Devise for Rails. Nel processo di registrazione predefinito, Devise richiede agli utenti di digitare la password due volte per la convalida e l'autenticazione. Come posso disabilitarlo?disabilita la conferma della password durante la registrazione durante l'utilizzo di devise

Grazie a tutti. :)

+0

Cosa fai se una persona fa un refuso digitando la password in una casella? Ci sono motivi per avere una conferma sui moduli di password, e dovresti essere sicuro di rimuoverlo – Gareth

+3

yup. vorrei rimuoverlo. per semplificare il processo di registrazione. qualche suggerimento su come disabilitarlo? –

+12

@Gareth Tipo di risposta tardiva, ma è possibile utilizzare la reimpostazione della password dell'email se gli utenti lo scrivono in modo errato. Un sacco di persone usabilità stanno iniziando a preferire questo approccio, in quanto è più semplice per l'utente. – LandonSchropp

risposta

82

Sono un po 'tardi per questo partito, ma avendo appena stato graffiare la mia testa sopra lo stesso problema per l'ultima ora o giù di lì, ho pensato' d condividere la soluzione più semplice che ho trovato: è sufficiente rimuovere il campo password_confirmation dal modulo di registrazione, che disabilita la necessità di confermare la password interamente!


La ragione di ciò sta nel lib/devise/models/validatable.rb nella fonte Devise:

module Devise 
    module Models 
    module Validatable 


     def self.included(base) 

     base.class_eval do 
      #....SNIP... 
      validates_confirmation_of :password, :if => :password_required? 
     end 
     end 

     #...SNIP... 

     def password_required? 
     !persisted? || !password.nil? || !password_confirmation.nil? 
     end 
    end 
    end 
end 

Nota che la convalida viene attivato solo se password_required? rendimenti true e password_required? torneranno false se il campo password_confirmation è nil.

Perché se il campo password_confirmation è presente nel modulo, sarà sempre incluso nell'hash dei parametri, come stringa vuota se viene lasciato vuoto, viene avviata la convalida. Tuttavia, se si rimuove l'input dal modulo, password_confirmation nei parametri sarà nil e pertanto la convalida non verrà attivata.

Spero che questo sia utile!

Grazie,

Tim

+1

Grazie @misertim. Hai ragione. In realtà ho dimenticato questa domanda. Hai ragione. La soluzione corretta è rimuovere il campo password_confirmation. Devise ignorerà la convalida. –

+0

@mistertim Quella era una risposta intelligente. Ero pronto a combattere con Devise per ore, ma è risultato piuttosto facile. Grazie. – rohitmishra

+0

Bellissima - Grazie! – JoeProgram

11

non ho familiarità con Devise, ma se si ha accesso al modello di cui il controller prima di salvare/validazione si potrebbe fare qualcosa di simile al seguente

model.password_confirmation = model.password 
model.save 
+0

grazie amico. È una buona idea. :) –

36

Sembra solo se si rimuove il requisito attr_accessible dal modello funziona bene senza di esso.

In una nota a margine, sono d'accordo con questa pratica, nel raro caso che ci fosse un errore di battitura, l'utente può semplicemente utilizzare il recupero della password per recuperare la propria password.

+11

Questa dovrebbe essere la risposta giusta. Supponendo che tu stia usando user.rb come il tuo modello di dispositivo semplicemente rimuovi attribute_accessible per password_confirmation e rimuovi il campo nella vista. –

+0

Ancora di più.Su alcune app la registrazione diventa asincrona, quindi l'invio degli stessi dati non è necessario, alcune convalide (che non sono critiche, questa non è) possono essere fatte in vista. – Hauleth

3

Per motivi di Rails 4 utenti che trovano questa domanda, è sufficiente eliminare :password_confirmation dalle params consentiti, che si dichiara in ApplicationController.rb.

before_filter :configure_permitted_parameters, if: :devise_controller? 

protected 

def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up) do |u| 
    u.permit(:username, :email, :password) 
    end 
    devise_parameter_sanitizer.for(:account_update) do |u| 
    u.permit(:username, :email, :password) 
    end 
end 
0

convalide di Devise di default (lib/escogitare/modelli/validatable.rb):

validates_confirmation_of :password, :if => :password_required? 

e di metodo:

def password_required? 
    !persisted? || !password.nil? || !password_confirmation.nil? 
end 

Abbiamo bisogno di ignorare Devise convalida della password di default. Mettere il seguente codice alla fine in modo che non venga sovrascritto da nessuna delle impostazioni di Devise.

validates_confirmation_of :password, if: :revalid 
def revalid 
    false 
end 

E il vostro modello sarebbe simile a questa:

class User < ActiveRecord::Base  
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, 
    :confirmable, :timeoutable, :validatable 

    validates_confirmation_of :password, if: :revalid 

    def revalid 
    false 
    end 
end 

Poi rimuovere il campo password_confirmation dal modulo di registrazione.

2

soluzione più semplice:

Rimuovere : validabile da

devise :database_authenticatable, :registerable, 
:recoverable, :rememberable, :trackable, 
:confirmable, :timeoutable, :validatable 

;)

1

Hai solo bisogno di rimuovere il campo password_confirmation dal modulo.

0

penso che questo è il modo più semplice per disattivare conferma della password: https://github.com/plataformatec/devise/wiki/Disable-password-confirmation-during-registration

Alcuni utenti vuole rendere il processo di registrazione più breve e più facile. Uno dei campi che è possibile rimuovere è la conferma della password.

soluzione più semplice è: si può semplicemente rimuovere il campo password_confirmation dal modulo di registrazione situato a disposizione testamentaria/iscrizioni/new.html.erb (new.html.haml se si utilizza HAML), che disabilita la necessità per confermare completamente la password!

La ragione di ciò sta nel lib/ideare/modelli/validatable.rb nella fonte Devise:

Nota che la convalida viene attivato solo se password_required? restituisce true e password_required? restituirà false se il campo password_confirmation è nullo.

Perché dove il campo password_confirmation è presente in forma, sarà sempre inclusa nel parametri hash, come una stringa vuota se viene lasciato vuoto, la validazione viene effettuata. Tuttavia, se si rimuove l'input dal modulo, , la password_confirmation nei parametri sarà nulla, e pertanto la convalida non sarà attivata .