2011-01-11 13 views
41

Ho un modulo in cui raccolgo molte informazioni in Rails. Parte di questo modulo sono i campi per la registrazione di un nuovo utente. Poiché Devise ha controller/azioni specifiche per creare un nuovo utente, non so come creare a livello di programmazione un utente in un'azione completamente diversa che crea anche un altro record. Non posso davvero separare il modulo di registrazione dell'utente. Non riesco a capire come creare un utente, e quindi accedere l'utente, come ho potuto facilmente fare in Authlogic.Come creare manualmente una nuova sessione utente e utente in Devise?

Ho usato sia Authlogic sia Devise e penso che ognuno abbia i suoi punti di forza e di debolezza. Con Devise, amo quanto sia veloce "andare avanti" con un nuovo progetto, ma personalizzarlo sembra essere un dolore. Authlogic ha avuto così tanti problemi con Rails 3 qualche tempo fa, che sono passato a Devise. Ora sto lavorando a un nuovo progetto e inizierò da zero.

Quindi penso che ci siano 2 potenziali risposte a questa domanda: (a) come farlo in Devise, o (b) perché dovrei semplicemente passare ad Authlogic con Rails 3 invece.

+0

La risposta accettata funziona sia per Devise che per Authlogic. –

risposta

76

È possibile creare un nuovo utente Devise semplicemente creando un nuovo modello utente (vedi https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface)

@user = User.new(:email => '[email protected]', :password => 'password', :password_confirmation => 'password') 
@user.save 

ad accedere l'utente appena creato, utilizzare sign_in @user

+0

Lo stesso identico codice funziona anche per Authlogic (sto utilizzando la versione 1.4.4.1). –

+0

dov'è la documentazione per questo .. come in come si sa che esiste una funzione denominata sign_in – codeAnand

+2

Puoi vederlo nella sezione "test helpers" nel readme su https://github.com/plataformatec/devise , puoi vedere la documentazione qui: http://rubydoc.info/github/plataformatec/devise/master/frames –

7

Salvare l'utente appena creato prima sign_in fallirà perché devise non ha ancora riempito i campi richiesti per l'oggetto User ancora. Quindi il codice di David funzionerà per la pagina corrente, ma la pagina successiva non otterrà l'utente che ha eseguito l'accesso, poiché l'utente viene salvato solo dopo aver impostato la sessione. Questo succede quando uso Mongoid e non so se si tratta di un problema specifico di Mongodb.

Per risolvere questo problema, ho una soluzione molto imperfetta per chiamare sign_in due volte. Il primo sign_in salverà l'utente. Funziona ma le persone possono migliorarlo sicuramente.

@user = User.new(:email => '[email protected]', 
       :password => 'password', 
       :password_confirmation => 'password') 
# This will save the user in db with fields for devise 
sign_in @user 
# :bypass is set to ignore devise related callbacks and only save the 
# user into session. 
sign_in @user, :bypass => true 
+2

Posso chiederti se il problema si verifica ancora se salvi esplicitamente l'utente prima di chiamare sign_in? E se ciò non funziona, aggiunge una chiamata per ricaricare l'utente dopo aver salvato ma prima di firmare? – m3z

4

Per le nuove persone che vedono questa domanda ...

Un modo semplice per farlo è nel vostro

config/routes.rb 

si dovrebbe avere una linea come la seguente:

devise_for :users 

quindi, devi solo aggiungere un prefisso di percorso che idea utilizzerà:

devise_for :users, :path_prefix =>'auth' 

Spero che sia d'aiuto!