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