Generar un nuevo usuario programáticamente (Auth Logic)
-
05-07-2019 - |
Pregunta
Soy bastante nuevo en Ruby on Rails, por favor, tenga paciencia conmigo :)
Estoy procesando un archivo .csv importado en Rails y quiero crear nuevos usuarios mediante programación (estoy usando la gema AuthLogic junto con el requisito de rol), hasta ahora estoy usando:
Línea de ejemplo:
Steve.Jobs@apple.com, Steve, Jobs, 555-APPLE
Código:
def new_user(line)
params = Hash.new
params[:user] = Hash.new
params[:user]["email"] = line[0]
params[:user]["first_name"] = line[1]
params[:user]["last_name"] = line[3]
params[:user]["phone"] = line[4]
user = User.new(params[:user])
user.save
end
El problema es que esto no agrega un nuevo usuario, lo intenta pero falla (DB Begin seguido de Rollback), asumo porque no estoy completando todos los campos, como inicio de sesión, contraseña, etc.
¿Tengo que generar explícitamente valores para estos campos?
Solución 2
Ok, así que me las arreglé para responder mi propia pregunta, aunque no de la forma más ideal:
def new_user(line)
params = Hash.new
params[:user] = Hash.new
params[:user]["email"] = line[0]
params[:user]["first_name"] = line[1]
params[:user]["last_name"] = line[2]
params[:user]["phone"] = line[3]
#generate random password of length 6
password = ActiveSupport::SecureRandom.base64(6)
#generate username by adding first and last name + 3 random characters
username = (line[1] + line[2])
username = username + ActiveSupport::SecureRandom.base64(3)
params[:user]["login"] = username
params[:user]["password"] = password
params[:user]["password_confirmation"] = password
#check to see if user already exists
@existing_user = User.find_by_email(line[0])
if(@existing_user)
#user exists
#do nothing
else
#user is brand new
@new_user = User.new(params[:user])
@new_user.reset_persistence_token
if(@new_user.save)
@new_user = User.find_by_email(line[0])
#user saved successfully
else
#a problem occurred
flash[:errors] = @new_user.errors
end
end
end
Otros consejos
Me encontré con este mismo problema ayer. Sin embargo, estoy usando el complemento oauth, por lo que el inicio de sesión / correo electrónico no son campos obligatorios para mí, estaba fallando porque el token de persistencia no estaba presente, lo cual logré agregando
user.reset_persistence_token
justo antes de llamar a user.save
Espero que ayude un poco. Sería bueno encontrar una forma más limpia de hacerlo.