1

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

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

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

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

4

3 回答 3

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 %>

使用设计,您可以这样做:

  <% if user_signed_in? %>
    <%= link_to("Logout", destroy_user_session_path, :method => :delete) %>
  <% else %>
    <%= link_to 'Login', new_user_session_path %>
  <% end %>

在此处查看设计文档

于 2013-07-08T05:13:11.087 回答
0

@current_user 似乎为零。这就是为什么总是返回其他部分。在 if 语句之前创建一个调试器并检查 @current_user 是否持有任何值。它将帮助您决定下一步该做什么。

于 2013-07-08T05:15:15.777 回答
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 的方式工作了吗?:)

于 2013-07-08T10:55:17.420 回答