0

Twitter/FB の Omniauth ログインをセットアップしようとしています。ユーザーの作成時にパスワードと電子メールを検証する独自の認証システムを作成しました。ただし、ユーザーが Twitter/Fb からログインするときに、パスワードや電子メールを検証したくありません。

omn​​iauth_login というユーザー属性を作成しました。should_validate_password で検証が必要かどうかをテストするブール値として使用していますか? 方法。

ユーザー.rb

attr_accessor :password, :updating_password, :omniauth_login
validates_presence_of :password, :if => :should_validate_password?
validates_confirmation_of :password, :if => :should_validate_password?

def should_validate_password?
  (updating_password || new_record?) && !(self.omniauth_login == 'true')
end

def self.create_with_omniauth(auth)
  create! do |user|
    user.provider = auth["provider"]
    user.uid = auth["uid"]
    user.name = auth["info"]["name"]
  end
end

ユーザーの作成に使用したコントローラーは次のとおりです。

sessions_controller.rb

def omniauth_create
  auth = request.env["omniauth.auth"]
  user = User.new
  user.omniauth_login = 'true'
  user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) ||         
         User.create_with_omniauth(auth)
  session[:user_id] = user.id
  redirect_to user
end

Twitter 経由でログインして新しいユーザーを作成しようとすると、まだ検証エラーが発生します。

Validation failed: Password can't be blank, Email can't be blank, Email is not valid.

オブジェクトが create_with_omniauth メソッドで作成されている場合、パスワードと電子メールの検証をスキップするにはどうすればよいですか?

ありがとう。

4

1 に答える 1

0

ここでの問題は、User の 2 つの個別のインスタンスがあり、1 つは omniauth_login が「true」に設定されており、もう 1 つは設定されていないことだと思います。最初のものはから得られます

user = User.new
user.omniauth_login = 'true'

2つ目は

User.create_with_omniauth(auth)

. ここで作成された 2 番目のインスタンスでは、omniauth_login が「true」に設定されていないため、引き続き検証が実行されます。代わりにこれを試してください

user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) ||         
 User.create_with_omniauth(auth)

そして create_with_omniauth に を追加しuser.omniauth_login = 'true' ます。

于 2012-06-09T20:28:03.060 に答える