2015-06-30 111 views
3

我正在使用名为omniauth-facebook的宝石,我成功实现了Facebook登录验证。为什么不在这种情况下调试工作?

它看起来不错,但它不会将整个对象的数据传递给视图。它只是说无。

当使用'debug'或'inspect'时它应该显示一系列的东西。它以某种方式显示session [:name]的内容。

控制器

class SessionsController < ApplicationController 
    def create 
     @auth = request.env["omniauth.auth"] 
     session[:oauth_token] = @auth.credentials.token 
     session[:username] = @auth.extra.raw_info.username 

     session[:name] = @auth.extra.raw_info.name 
     redirect_to bookd_url, :notice => "Signed in!" 
    end 
end 

查看

<% if signed_in? %> 
    <%= @auth.inspect %> 
    <%= debug @auth %><br /> 
    <%= session[:name] %> 
<% end %> 

输出HTML

nil 
--- 
... 
John 
+1

'@ auth'的值是什么? - 你可以尝试在调试erb标签之前放入'<%= @ auth.inspect%>'吗? –

+0

@MaxWilliams感谢您的评论。它返回nil。 – HUSTEN

+0

这太奇怪了,因为如果我在视图中编码'@ auth.extra.raw_info.name'它会返回正确的名称。 – HUSTEN

回答

2

你创建控制器诉权n做重定向。重定向后,过程将从头开始,@auth将不再被定义。如果此时渲染视图,则@auth将为零。这是你的问题。

你需要考虑你在这里做什么。您从初始请求中的认证详细信息中设置一个@auth变量。然后,您可以使用它在会话中设置一些数据,例如记录谁登录。然后,在用户登录的下一页上,您想查看@auth。这并没有什么意义:一旦你认证了一个用户,你需要关心的是记住哪个用户当前登录了。你不需要存储他们登录的方式的详细信息,事实上你很可能不应该。

而应该做这样的事情:

#in ApplicationController, protected section 
protected 

def current_user 
    if @current_user 
    return @current_user 
    elsif session[:username] 
    @current_user = User.find_by_username(session[:username]) 
    return @current_user 
    end 
end 

这将允许你写在你的控制器和视图代码current_user,访问谁认证,原来的用户,这是整个原因记录有人在,并让他们登录。

+0

谢谢!我怎样才能传递给视图呢? – HUSTEN

+0

优秀的答案。非常感谢!! – HUSTEN

相关问题