【问题标题】:Generate a new user programmatically (Auth Logic)以编程方式生成新用户(身份验证逻辑)
【发布时间】:2019-01-23 10:03:59
【问题描述】:

我对 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),我假设是因为我没有填写所有字段,例如登录名、密码等。

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

【问题讨论】:

  • 你能发布你的用户对象吗?另外,您可以使用 user.valid?查看用户对象是否有效,并且 user.errors 数组将包含您尝试保存时所有错误的列表。
  • 嗨,Rob,感谢您回复我,看来从调用 user.errors 开始,问题是我没有指定密码或登录名(用户名)。密码问题很简单:password = ActiveSupport::SecureRandom.base64(6) params[:user]["password"] = password params[:user]["password_confirmation"] = password 设置密码,但是如何选择远程用户友好且唯一的登录名?

标签: ruby-on-rails authlogic


【解决方案1】:

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

user.reset_persistence_token

就在调用 user.save 之前

希望能有所帮助。要是能找到一种更清洁的方法就好了。

【讨论】:

    【解决方案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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多