Создать нового пользователя программно (логика аутентификации)
-
05-07-2019 - |
Вопрос
Я новичок в Ruby on Rails, поэтому, пожалуйста, потерпите :)
Я обрабатываю импортированный файл .csv в Rails и хочу программно создавать новых пользователей (я использую AuthLogic Gem вместе с требованиями роли). На данный момент я использую:
Пример строки:
Steve.Jobs@apple.com, Steve, Jobs, 555-APPLE
Код:
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
Проблема в том, что новый пользователь не добавляется, он пытается, но терпит неудачу (Начало БД, а затем откат), я предполагаю, потому что я не заполняю все поля, такие как логин, пароль и т. д.
Должен ли я явно генерировать значения для этих полей?
Решение 2
Хорошо, мне удалось ответить на свой вопрос, хотя и не самым идеальным образом:
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
Другие советы
Вчера я столкнулся с этой же проблемой.Однако я использую надстройку oauth, поэтому поля для входа/адреса электронной почты не являются для меня обязательными, это не удавалось из-за отсутствия токена персистентности, который я обошел, добавив
user.reset_persistence_token
непосредственно перед вызовом user.save
Надеюсь, это немного поможет.Было бы неплохо найти более чистый способ сделать это.