2

我对 Ruby on Rails 很陌生,所以请多多包涵:)

我正在 Rails 中处理导入的 .csv 文件,我想以编程方式创建新用户(我正在使用 AuthLogic Gem 和 Role Requirement),到目前为止我正在使用:

示例行:

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

问题是这不会添加新用户,它会尝试但失败(DB Begin 后跟 Rollback),我假设是因为我没有填写所有字段,例如登录名、密码等。

我是否必须为这些字段显式生成值?

4

2 回答 2

2

我昨天遇到了同样的问题。我正在使用 oauth 插件,所以登录/电子邮件对我来说不是必需的字段,它在持久性令牌不存在时失败,我通过添加来解决

user.reset_persistence_token

就在调用 user.save 之前

希望那些对你有帮助。很高兴找到一种更清洁的方法。

于 2009-10-22T14:39:14.603 回答
1

好的所以我已经设法回答了我自己的问题,虽然不是最理想的方式:

 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 
于 2009-10-22T20:04:32.097 回答