Генерация нового пользователя программно (Auth Logic)

Я новичок в Ruby on Rails, поэтому, пожалуйста, потерпите меня :)

Я обрабатываю импортированный файл .csv в Rails и хочу программно создавать новых пользователей (я использую AuthLogic Gem вместе с ролевым требованием), пока я использую:

Пример строки:

[email protected], 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

Проблема в том, что это не добавляет нового пользователя, он пытается, но терпит неудачу (начало БД с последующим откатом), я полагаю, потому что я не заполняю все поля, такие как логин, пароль и т. д.

Должен ли я явно генерировать значения для этих полей?


person Chris    schedule 22.10.2009    source источник
comment
Можете ли вы опубликовать свой объект User? Кроме того, вы можете использовать user.valid? чтобы убедиться, что пользовательский объект действителен, а массив user.errors будет содержать список всех ошибок при попытке сохранения.   -  person Rob Di Marco    schedule 22.10.2009
comment
Привет, Роб, спасибо, что ответили мне, похоже, что из-за вызова user.errors проблема в том, что я не указываю пароль или логин (имя пользователя). Проблема с паролем проста, насколько я могу: пароль = ActiveSupport::SecureRandom.base64(6) params[:user][password] = password params[:user][password_confirmation] = password для установки пароля, но как мне выбрать имя для входа, удобное для удаленного доступа и уникальное?   -  person Chris    schedule 22.10.2009


Ответы (2)


Я столкнулся с этой же проблемой вчера. Я использую надстройку oauth, поэтому логин/адрес электронной почты не являются обязательными для меня полями, он не работал из-за отсутствия токена постоянства, который я обошел, добавив

user.reset_persistence_token

непосредственно перед вызовом user.save

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

person Marc    schedule 22.10.2009

Итак, мне удалось ответить на свой вопрос, хотя и не самым идеальным образом:

 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 
person Chris    schedule 22.10.2009