以编程方式使用devise和first_or_create创建User

时间:2015-07-29 06:25:46

标签: ruby-on-rails ruby-on-rails-4 devise activemodel

我必须通过api以编程方式创建用户 - 我能够创建传递适当参数的用户,即:

x={"email"=>"kid@kid.com", "username"=>"levi", "password"=>"password","password_confirmation" => "password", "firstname"=>"Bob", "lastname"=>"Smith"}
u=User.new(x)
u.valid?

能够在保存之前检查这是否是有效用户等。但问题是如果用户名或电子邮件之类的参数已经存在于另一个用户,我将在保存时收到错误。

现在我可以检查用户是否已经存在(即u=User.where(username: x['username'])u=User.where(email: x['email']) - 这可能就够了,但我想知道是否有办法u=User.where(x).first_or_create with devise?通常与其他模型一起使用但不设计。

1 个答案:

答案 0 :(得分:0)

find_or_create_by(http://apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_create_by)的问题在于它会尝试查找与您传入的属性所有匹配的用户作为条件。它很少是一种有用的方法。相反,将其包装在您的模型中:

class User < ActiveRecord::Base
  def self.username_find_or_create(attributes = {})
    User.create(attributes) unless User.exists?(attributes.slice(:username, :email))
  end
end

Exists比其他地方快)