从omniauth hash中提取电子邮件以验证用户模型

时间:2011-03-22 04:54:32

标签: ruby-on-rails ruby-on-rails-3 devise omniauth

我正在使用omniauth并设计用他们的facebook帐户登录用户,一切正常但是当我尝试从哈希中取出他们的电子邮件时我得到了这个错误:

NoMethodError in AuthenticationsController#create
undefined method `id' for "/":String

以下是错误的完整日志:http://pastie.org/1698569

错误消失了,让我在刷新后就可以正常登录了!

编辑:事实证明它在我的身份验证控制器中的第22行

     sign_in_and_redirect_to(:user, root_path) 

由于某种原因,在运行此方法后,我无法在用户

中签名
 def apply_facebook(omniauth)                    
   if (extra = omniauth['extra']['user_hash'] rescue false)  
   self.email = (extra['email'] rescue '')
 end
end

但是,如果我不运行该方法,那么它可以sign_in_and_redirect_to就好了

这是我的控制器/型号http://pastie.org/1698453

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您不能将root_path用作sign_in_and_redirect的第二个参数。以下是一些可以使用它的方法:

sign_in_and_redirect :user, @user                      # sign_in(scope, resource)
sign_in_and_redirect @user                             # sign_in(resource)
sign_in_and_redirect @user, :event => :authentication  # sign_in(resource, options)
sign_in_and_redirect @user, :bypass => true            # sign_in(resource, options)

由于您的第二个参数不是资源或选项(它是一个字符串),因此您收到错误。您需要将其更改为:

sign_in_and_redirect(:user, user) # based on your pastie

如果要在登录后自定义返回路径以强制它转到其他URL,您可以在ApplicationController中执行以下操作:

def after_sign_in_path_for(resource)
  "/go/to/this/path"
end