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を返すので実行されないことに気付きました(名前が既に存在していても)。なぜループが実行されないのか分かりません。
ご協力いただければ幸いです。
の終わりで
do
を逃している:/ – user3275852あなたはない最初のために、新しいユーザーに呼び出されます '' first_or_createためのブロックを理解する必要があります。 –
はい、わかりました。一意の名前を持つユーザー1人を作成しました。 "mock-name"と同じ名前のFacebookやomniauthを使って別のユーザーとサインインしようとしました。その結果、サインアップページにリダイレクトされました。 – user3275852