2012-04-04 37 views
3

我有我的用户模型(https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview)的方法(使用设计和确认的)呼吁new_with_session所要求的Omniauth +设计:设计,Omniauth和“新与会话”

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 

用户被允许登录使用谷歌或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. 如果我想从谷歌/ Facebook的一些保存更多的数据,如用户名,我应该把它添加到我的自定义new_with_session?如果是这样,为什么?

回答

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方法,并在你的Users::OmniauthCallbacksController相应的谷歌的方法。

如果你想从Facebook或谷歌回调使用额外的数据,创建用户时,你可以将它添加到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做任何事情。我仍然在学习设计和OmniAuth,但是,所以如果有什么不对这种方法,我很想听到它。

+0

我在做同样的事情和工作,但因为它是写new_with_session我想知道,如果有必要的东西 – 2012-04-05 14:16:16

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 
+0

这是我需要的知识。 – ahnbizcad 2014-10-05 20:34:32