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
答案 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
并查看代码,以访问最初验证的用户,这是记录某人并让他们登录的全部原因。