3

new_with_sessionOmniauth + Devise ( https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview )で必要に応じて呼び出されるユーザー モデル (devise と確認可能を使用する) にメソッドがあります。

def self.new_with_session(params, session)
  super.tap do |user|
    if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] || session["devise.google_data"] && session["devise.google_data"]["extra"]["raw_info"]
      user.email = data["email"]
    end
  end
end

ユーザーは Google または Facebook のいずれかを使用してサインインすることが許可されており、次の行を使用して権利を保存していますuser.email

if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] || session["devise.google_data"] && session["devise.google_data"]["extra"]["raw_info"]

しかし、私はそれが正しい方法だとは思わないので...

  1. 演算子user.emailを使用するよりも良いビルド方法を知っていますか?||
  2. ユーザー名など、Google/Facebook からさらにデータを保存したい場合は、カスタムに追加する必要がありますnew_with_sessionか? もしそうなら、なぜですか?
4

2 に答える 2

9

new_with_session は build_resource で使用されます。これは、登録可能 (ユーザー登録フォーム) で使用されます。

これは、Facebook/Omniauth セッションが既に存在し、登録フォームに omniauth からのデータを事前に入力したい場合にのみ役立ちます。(コールバック時にアカウントを自動的に作成していないと仮定します)

# Build a devise resource passing in the session. Useful to move
# temporary session data to the newly created user.
def build_resource(hash=nil)
  hash ||= params[resource_name] || {}
  self.resource = resource_class.new_with_session(hash, session)
end
于 2012-06-19T04:44:43.093 に答える
1

システム内の既存のアカウントを Facebook または Gmail 経由で電子メール アドレスを識別子として使用して認証し、その電子メール アドレスが存在しない場合はその電子メール アドレスでアカウントを作成することを検討していますか? もしそうなら、私はあなたが使用する必要はないと思いますnew_with_session; 引用したリンクで説明されているように、モデルメソッドを使用できます。

def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
  data = access_token.extra.raw_info
  if user = User.where(:email => data.email).first
    user
  else # Create a user with a stub password. 
    User.create!(:email => data.email, :password => Devise.friendly_token[0,20]) 
  end
end

同様のself.find_for_google_oauthメソッドを作成し、対応する google メソッドをUsers::OmniauthCallbacksController.

Facebook または Google コールバックからの追加データを使用する場合は、ユーザーを作成するときに、次のUser.create!ように find_for_oauth メソッドの行に追加するだけです。

User.create!(:email => data.email, 
  :first_name => data.first_name, 
  :last_name => data.last_name, 
  :password => Devise.friendly_token[0,20])

これは私にとってはうまくいき、何もする必要はありませんでしたnew_with_session。ただし、Devise と OmniAuth についてはまだ学習中なので、このアプローチに問題がある場合は、ぜひお知らせください。

于 2012-04-05T14:08:51.653 に答える