2016-12-03 2 views
0

私はdevise + omniauthでユーザー認証のアプリケーションを持っています。 私のUserモデルでは、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を返すので実行されないことに気付きました(名前が既に存在していても)。なぜループが実行されないのか分かりません。

ご協力いただければ幸いです。

答えて

0

あなたがまだ機能していないuntil

until(User.find_by(name: uniqname).nil?) do 
+0

の終わりでdoを逃している:/ – user3275852

+0

あなたはない最初のために、新しいユーザーに呼び出されます '' first_or_createためのブロックを理解する必要があります。 –

+0

はい、わかりました。一意の名前を持つユーザー1人を作成しました。 "mock-name"と同じ名前のFacebookやomniauthを使って別のユーザーとサインインしようとしました。その結果、サインアップページにリダイレクトされました。 – user3275852

関連する問題