2015-08-24 9 views
9

Nella nostra applicazione abbiamo utenti normali. Tuttavia, vogliamo essere in grado di fare inviti, invitare determinate persone. Si noti che un invito è direttamente accoppiato a un utente, in quanto vogliamo essere in grado di impostare determinate impostazioni per questi utenti già. (Stiamo mitigando i clienti dal nostro vecchio software al nuovo).Idea: creare utenti senza password

Quindi:

  • Un amministratore dovrebbe essere in grado di creare un nuovo utente e modificarne le impostazioni.
  • Quando qualcuno segue un collegamento con il proprio invitation_token, dovrebbe visualizzare un modulo in cui è possibile impostare una password per il proprio account.

Quello che sto avendo problemi, è come abilitare l'amministratore a creare un account utente, ignorando la normale convalida della password. Sarebbe una soluzione orribile se fosse necessario impostare una password predefinita, in quanto ciò creerebbe un grave difetto di sicurezza.

Come creare un nuovo utente in Devise senza fornire una password?

+0

Ti appare un errore di vincolo database o è il tuo nuovo record utente semplicemente non '' valida? – Josh

risposta

30

Ci sono almeno due modi per fare ciò che si vuole:

Metodo 1: Metodo password_required? di

sovraccarico Devise

class User < ActiveRecord::Base 
    attr_accessor :skip_password_validation # virtual attribute to skip password validation while saving 

    protected 

    def password_required? 
    return false if skip_password_validation 
    super 
    end 
end 

## Saving: 
# 
user.skip_password_validation = true 
user.save 

Metodo 2:

Disabilita convalida con validate: false optio n:

user.save(validate: false) 

Questo salterà la convalida di tutti i campi (non solo la password). In questo caso dovresti assicurarti che tutti gli altri campi siano validi.

...

Ma vi consiglio di non creare utenti senza password nel vostro caso particolare. Creerei una tabella aggiuntiva (ad esempio: invitations) e memorizzerò tutte le informazioni richieste, inclusi i campi che si desidera assegnare a un utente dopo la conferma.

+1

Sarebbe interessante spiegare perché non si consiglia di creare utenti senza password. – Pak

+0

@Pak Ho consigliato di non creare utenti senza password in questa particolare situazione. Manterrà il tuo DB pulito e normalizzato e ti impedirà di avere problemi con la personalizzazione di Devise. – chumakoff

3

TL; DR:

user.define_singleton_method(:password_required?) { false } 

Fiddle

class MockDeviseUser 
    protected 
    def password_required? 
    true 
    end 
end 

class User < MockDeviseUser 
    def is_password_required? 
    puts password_required? 
    end 
end 

unrequired_password_user = User.new 
unrequired_password_user.define_singleton_method(:password_required?) { false } 
unrequired_password_user.is_password_required? 
regular_user = User.new 
regular_user.is_password_required? 
#false 
#true