0
我有一个用devise + omniauth进行用户认证的应用程序。 在我的用户模型中,我想确保user.name是唯一的,以便在我的应用程序中没有重复的用户名。Facebook omniauth:确保唯一的用户名
环顾四周后,我想出了下面的代码:
User.rb
validates :name, presence: true, uniqueness: true, length: {minimum: 6, maximum: 30}
def ensure_username_uniqueness
uniqname = (self.name).dup
num = 1
until(User.find_by(name: uniqname).nil?) do ## returns true, should be false ##
uniqname = self.name+"-#{num}"
num += 1
end
self.name = uniqname
end
private
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.provider = auth.provider
user.uid = auth.uid
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
user.name = auth.info.name[0..29].downcase.gsub(" ", "-")
user.ensure_username_uniqueness
user.remote_avatar_url = auth.info.image
user.skip_confirmation!
end
end
当我测试的Facebook注册已存在于数据库中,我重定向到一个名称注册页面(意味着注册失败)。
我设置了一个binding.pry,并注意到'until'循环没有得到执行,因为它返回true(即使该名称已经存在)。我似乎无法理解为什么循环没有得到执行。
任何帮助将不胜感激!
仍然没有工作结束
do
:/ – user3275852你应该明白了''first_or_create块将在新的用户调用,而不是第一位。 –
是的,我明白了。我创建了一个具有唯一名称的设计用户,例如“模拟名称”,然后尝试使用具有相同名称的Facebook和omniauth与不同的用户登录。结果是我被重定向到注册页面。 – user3275852