2009-10-22 46 views
2

我是很新的Ruby on Rails的,所以请多多包涵:)生成一个新的用户编程(验证逻辑)

我处理Rails中导入.csv文件,我想以编程方式创建新用户(我使用的是AuthLogic宝石以及角色需求),到目前为止我使用:

示例行:

[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 

问题是,这不会添加一个新用户,它试图但失败(数据库开始后跟回滚),我假设因为我没有填写所有字段,如登录名,密码等等

我是否必须明确地为这些字段生成值?

任何帮助将不胜感激

+0

您可以发布您的用户对象? 另外,你可以使用user.valid?查看用户对象是否有效,并且当您尝试保存时,user.errors数组将包含所有错误的列表。 – 2009-10-22 14:38:33

+0

嗨罗布,感谢回到我身边,似乎从调用user.errors的问题是,我没有指定密码或登录(用户名)。密码问题很容易,因为我可以这样做: password = ActiveSupport :: SecureRandom.base64(6) params [:user] [“password”] =密码 params [:user] [“password_confirmation”] =密码 设置密码,但是如何选择远程用户友好且唯一的登录名? – Chris 2009-10-22 19:28:04

回答

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 
2

昨天我遇到了同样的问题。我使用的是OAuth的插件,虽然对我来说并不需要登录/电子邮件字段,它是在持久性失败令牌不存在,我加入

user.reset_persistence_token 

得到周围只是打电话user.save

希望能有所帮助。很高兴找到一个更干净的方式来做到这一点。