Why won't debug work in this situation?

时间:2015-06-30 13:28:16

标签: ruby-on-rails facebook

I'm using the gem called omniauth-facebook, with which I succeeded at implementing facebook login auth.

It looks fine but it won't pass data of the whole object to the view. It just says nil.

It should show an array of things when using 'debug' or 'inspect'. It shows the content of session[:name] fine somehow.

Controller

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

View

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

Output HTML

nil
--- 
...
John

1 个答案:

答案 0 :(得分:2)

您的创建控制器操作会执行重定向。重定向后,该过程将从头开始,并且将不再定义@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并查看代码,以访问最初验证的用户,这是记录某人并让他们登录的全部原因。