【问题标题】:pulling email from omniauth hash to validate user model从omniauth 哈希中提取电子邮件以验证用户模型
【发布时间】:2011-03-22 04:54:32
【问题描述】:

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

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

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

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

编辑:原来它在我的身份验证控制器中的第 22 行

     sign_in_and_redirect_to(:user, root_path) 

由于某种原因,运行此方法后我无法登录 :user

 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

非常感谢任何帮助

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 非常感谢您解决了 facebook 的问题,但是现在我在通过 twitter 进行身份验证时遇到了错误。我没有更改任何其他代码,但出现此错误:AuthenticationsController#create 中的 ActionDispatch::Cookies::CookieOverflow,似乎它与 rails 中的 4kb 限制有关,但我该如何解决这个问题?非常感谢。
    • 我从 session_store 切换到 active_record_store,现在一切正常 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2023-03-17
    • 2019-06-25
    相关资源
    最近更新 更多