2012-04-25 97 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 

示例所示然后将工作中的控制器代码 - 它将把用户重定向到注册。