登录/退出麻烦

时间:2013-07-08 04:43:02

标签: ruby-on-rails ruby-on-rails-3 login ruby-on-rails-3.2

我正在尝试创建简单的登录/注销链接,但似乎我可以让按钮说登录或说注销...如果用户登录或注销我无法切换

首先,这是我的应用程序控制器的代码:

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用户名。这是相关信息:

来自app / models / user.rb

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”。 (但不知何故,其他用户登录工作得很好......除了我不能为他们登录注销。)

3 个答案:

答案 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的方式工作了吗? :)