![](/img/trans.png)
[英]Devise + Omniauth = undefined method `new_session_path'
[英]Devise, Omniauth and 'new with session'
我的用戶 model(使用 devise 和可確認的)根據 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
嗎? 如果是這樣,為什么?new_with_session 用於 build_resource。 這與可注冊(用戶注冊表)一起使用。
這僅在您的 Facebook/Omniauth session 已經存在並且您想使用 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
您是否希望通過 Facebook 或 Gmail 驗證系統中的現有帳戶,使用 email 地址作為標識符,並使用該 email 地址創建一個帳戶(如果該地址尚不存在)? 如果是這樣,我認為您不需要使用new_with_session
; 您可以使用您引用的鏈接中描述的 model 方法:
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
您可以在Users::OmniauthCallbacksController
中創建類似的self.find_for_google_oauth
方法和相應的 google 方法。
如果您想使用來自 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,所以如果這種方法有問題,我很樂意聽到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.