Gerar um novo usuário por meio de programação (Auth Logic)
-
05-07-2019 - |
Pergunta
Eu sou muito novo para Ruby on Rails por isso, tenha comigo:)
Estou processando um arquivo .csv importados em Rails e quero programaticamente criar novos usuários (estou usando o AuthLogic Gem juntamente com o Requisito Papel), até agora eu estou usando:
Exemplo de linha:
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
O problema é que isso não adicionar um novo usuário, ele tenta mas falha (DB Begin seguido de Reversão), eu assumo porque eu não estou preenchendo todos os campos, tais como login, senha etc.
Eu tenho que gerar explicitamente valores para esses campos?
Solução 2
Ok Então eu consegui responder a minha própria pergunta, embora não o mais ideal de maneiras:
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
Outras dicas
Me deparei com este mesmo problema ontem. Eu estou usando o addon oauth embora assim o login / e-mail não são necessários campos para mim, ele estava falhando sobre a persistência token não estando presente que eu tenho em torno adicionando
user.reset_persistence_token
apenas antes de chamar user.save
Espero que ajude um pouco. Seria bom para encontrar uma maneira mais limpa de fazê-lo.