2012-04-25 57 views
2

我也跟着在https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview中描述的步驟,有這樣的用戶模型的方法:的Rails 3 *設計的Facebook OmniAuth間歇性地失敗,NoMethodError

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

我斷斷續續得到像

一個錯誤NoMethodError發生在omniauth_callbacks#Facebook的:

未定義的方法email' for "false":String app/models/user.rb:138:in find_for_facebook_oauth」

,我還沒有能夠重現。這個問題的根源是什麼?

+0

可能出現'raw_info'返回'「false」'的情況。爲什麼?我不知道......我認爲'request.env [「omniauth.auth」]是一個簡單的散列,所以我不知道他們如何調用'access_token.extra.raw_info'。也許他們把它變成一個展開式的東西或類似的東西。 – Robin 2012-04-25 00:05:41

+0

正好。與raw_info對應的值應該是包含電子郵件等值的散列值,但是這次我只是得到「false」。發生這種情況時我無法弄清楚這些情況。 – ertan 2012-04-25 02:36:28

+0

也許當用戶拒絕授予權限? – Robin 2012-04-25 12:59:44

回答

1

我不確定是什麼原因造成這種情況。這裏有一個變通,簡單地創建一個新的對象:

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

示例所示然後將工作中的控制器代碼 - 它將把用戶重定向到註冊。