我的用户模型中有一个方法(使用设计和确认),根据Omniauth + Devise(https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview)的要求调用new_with_session
:
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"]
但我不认为是正确的方式,所以......
user.email
的方法比使用||
运算符更好?new_with_session
吗?如果是这样,为什么? 答案 0 :(得分: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
答案 1 :(得分: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
方法和相应的Google方法。
如果您想使用Facebook或Google回调中的其他数据,则在创建用户时,您只需将其添加到find_for_oauth方法中的User.create!
行,如下所示:
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,所以如果这种方法有问题,我很乐意听到它。