2011-01-11 17 views
41

Tengo un formulario donde recopilo mucha información en Rails. Parte de este formulario son campos para que un nuevo usuario se registre. Dado que Devise tiene controladores/acciones específicamente para crear un nuevo usuario, no sé cómo crear programáticamente un usuario en una acción completamente diferente que también crea otro registro. Realmente no puedo tener el formulario de registro de usuario por separado. No puedo entender cómo crear un usuario y luego iniciar sesión con el usuario, como podría hacer fácilmente en Authlogic.¿Cómo crear manualmente una nueva sesión de usuario y usuario en Devise?

He utilizado Authlogic y Devise, y creo que cada uno tiene sus fortalezas y debilidades. Con Devise, me encanta lo rápido que es "ponerme en marcha" con un nuevo proyecto, pero personalizarlo parece ser un problema. Authlogic tenía tantos problemas con Rails 3 hace un tiempo que me cambié a Devise. Ahora estoy trabajando en un nuevo proyecto y puedo empezar desde cero.

Así que creo que hay 2 posibles respuestas a esta pregunta: (a) cómo hacer esto en Devise, o (b) por qué debería simplemente cambiar a Authlogic con Rails 3 en su lugar.

+0

Su respuesta aceptada funciona tanto para Devise como para Authlogic. –

Respuesta

76

Se puede crear un nuevo usuario Diseñar simplemente mediante la creación de un nuevo modelo de usuario (ver 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 

entrar el usuario recién creado, utilice sign_in @user

+0

El mismo código funciona también para Authlogic (estoy ejecutando la versión 1.4.4.1). –

+0

dónde está la documentación para esto ... como en cómo se sabe que existe una función llamada sign_in – codeAnand

+2

Puede verla en la sección "ayudantes de prueba" en el archivo léame en https://github.com/plataformatec/devise Más específicamente , puede ver la documentación aquí: http://rubydoc.info/github/plataformatec/devise/master/frames –

7

ahorrando al usuario recién creado antes sign_in fallará porque todavía no ha completado los campos obligatorios para el objeto Usuario. Entonces, el código de David funcionará para la página actual, pero la página siguiente no recibirá al usuario que inició sesión, ya que el usuario solo se guarda después de establecer la sesión. Esto sucede cuando uso Mongoid, y no sé si es un problema específico de Mongodb.

Para solucionar este problema, tengo una solución muy imperfecta para llamar a sign_in dos veces. El primer signo_in salvará al usuario. Simplemente funciona, pero las personas pueden mejorarlo sin dudas.

@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

¿Puedo preguntar si el problema todavía ocurre si usted explícitamente guarda al usuario antes de llamar a sign_in? Y si eso no funciona, ¿agrega una llamada para volver a cargar al usuario después de guardar pero antes de iniciar sesión? – m3z

4

Para las personas nuevas que ven esta pregunta ...

Una forma sencilla de hacerlo es en su

config/routes.rb 

usted debe tener una línea como la siguiente:

devise_for :users 

, solo tiene que agregar un prefijo de ruta que el dispositivo utilizará:

devise_for :users, :path_prefix =>'auth' 

Espero que ayude!

Cuestiones relacionadas