Создать нового пользователя программно (логика аутентификации)

StackOverflow https://stackoverflow.com/questions/1607683

  •  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

Надеюсь, это немного поможет.Было бы неплохо найти более чистый способ сделать это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top