我正在尝试创建简单的登录/注销链接,但似乎我可以让按钮说登录或说注销...如果用户登录或注销我无法切换
首先,这是我的应用程序控制器的代码:
def current_user
begin
@current_user ||= User.find(session[:user_id]) if session[:user_id]
rescue Exception => e
nil
end
end
def user_signed_in?
return true if current_user
end
因此,对于我的登录/注销,我把它放在:
<% if @current_user %>
<%= link_to("Logout", destroy_user_session_path, :method => :delete) %>
<% else %>
<%= link_to 'Login', new_user_session_path %>
如果我输入“@ current_user = true”,那么无论用户是否登录,它都将始终返回“logout”。如果我只放“@current_user”那么无论如何它总会返回登录。那么我该怎么做才能让它真正做到我想做的事呢?
更新好的。这绝对是我的OmniAuth设置引起的问题。如果我使用facebook登录,那么登录注销就可以了。这可能与我发布的其他问题有关,其中主动管理员不再显示电子邮件地址...但如果登录了facebook管理员,则会显示Facebook用户名。这是相关信息:
def self.create_with_omniauth(auth)
create! do |user|
user.provider = auth['provider']
user.uid = auth['uid']
user.password = user.password_confirmation = SecureRandom.urlsafe_base64(n=6)
if auth['info']
user.name = auth['info']['name'] || ""
user.email = auth['info']['email'] || ""
来自application_controller.rb
def authenticate_active_admin_user!
authenticate_user!
unless current_user.superadmin?
redirect_to root_url, :alert => "Access denied."
end
end
def current_user
begin
@current_user ||= User.find(session[:user_id]) if session[:user_id]
rescue Exception => e
nil
end
end
def user_signed_in?
return true if current_user
end
def correct_user?
@user = User.find(params[:id])
unless current_user == @user
redirect_to root_url, :alert => "Access denied."
end
end
def authenticate_user!
if !current_user
redirect_to root_url, :alert => 'You need to sign in for access to this page.'
end
最后这是dubugger在登录Facebook时返回的内容(非Facebook用户刚刚返回“ - ”):
!ruby/object:User
attributes:
id: 5
email: courtneyloveless@notevenreal.com
encrypted_password: $10$rMOun/NhxPuMyVEIMeFOGSTw4IVmXGTz/qZ9tS63edevML6
reset_password_token:
reset_password_sent_at:
remember_created_at:
sign_in_count: 0
current_sign_in_at:
last_sign_in_at:
current_sign_in_ip:
last_sign_in_ip:
created_at: 2013-07-05 05:50:01.280117000 Z
updated_at: 2013-07-08 09:46:32.585278000 Z
superadmin: true
provider: facebook
uid: '6786173'
name: MoneyMark
所以希望足够的信息能够触及到底...这基本上只是说facebook用户是“current_user”。 (但不知何故,其他用户登录工作得很好......除了我不能为他们登录注销。)
答案 0 :(得分:1)
我建议使用Devise gem,但是如果你想创建自己的身份验证逻辑,请尝试以下代码:
你的application_controller.rb中的添加:
before_filter :login_required!
def login_required!
unless logged_in?
redirect_to '/login'
end
end
def logged_in?
current_user
end
def current_user
@current_user ||= User.find(session[:user_id])
end
在视图中添加:
<% if @current_user %>
<%= link_to("Logout", destroy_user_session_path, :method => :delete) %>
<% else %>
<%= link_to 'Login', new_user_session_path %>
<% end %>
与Devise你喜欢这样:
<% if user_signed_in? %>
<%= link_to("Logout", destroy_user_session_path, :method => :delete) %>
<% else %>
<%= link_to 'Login', new_user_session_path %>
<% end %>
查看Devise文档here
答案 1 :(得分:0)
似乎@current_user是零。这就是为什么总是返回部分。在if语句之前创建一个调试器,并检查@current_user是否包含任何值。它将帮助您决定下一步该做什么..
答案 2 :(得分:0)
解决了!
问题是application_controller正在覆盖设备自己的“def current_user”
首先我刚刚删除了“def current_user”条目...并且常规登录工作正常......但是facebook登录无法正常工作。所以我只是将应用程序控制器中的所有“def current_user”条目重命名为“current_user2”......就像这样:
def current_user2
begin
@current_user2 ||= User.find(session[:user_id]) if session[:user_id]
rescue Exception => e
nil
end
end
现在一切都按照user_signed_in的方式工作了吗? :)