2013-07-08 145 views
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 =真」,那麼它會無論用戶是否登錄,始終返回「註銷」。如果我只放置「@current_user」,那麼無論如何它總是會返回登錄。那麼我應該怎麼做,以便它實際上做我想做的事情?

UPDATE好的。這絕對是我的OmniAuth設置造成的問題。如果我用Facebook登錄,那麼登錄註銷就可以正常工作。這可能與我發佈的其他問題有關,其中活動管理員不再顯示電子郵件地址......但如果Facebook管理員登錄,它將顯示一個Facebook用戶名。這裏的培訓相關信息:

從應用程序/模型/ 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: [email protected] 
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 

所以希望這足夠INF o深入到底...這基本上只是說facebook用戶是「current_user」。 (但不知何故其他用戶登錄工作正常...除了我不能做他們的登錄註銷。)

回答

1

我會建議使用Devise的寶石,但如果你想創建自己的身份驗證邏輯嘗試以下代碼:

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

退房的設計文檔here

+0

其實我正在使用設計。有沒有一些簡單的方法來與設計做到這一點? –

+0

當然,設計有助手方法'user_signed_in?'你可以使用這個。我會更新我的回答 –

+0

當我說,它只是總是說登錄。我認爲其他用戶是正確的,並且當前用戶是......以某種方式......設置爲零。我可以發佈代碼,但我應該發佈哪個文件?有認證控制器,應用程序控制器(我相信我上面發佈的)users.rb模型(來自模型,而不是管理文件夾中的其他模型...)看到它是如何變得混亂。 :) –

0

這似乎是@current_user爲零。這就是爲什麼總是返回部分。在if語句之前創建一個調試器並檢查@current_user是否保存任何值。它會幫助你決定下一步該做什麼..

+0

好的。你能解釋怎麼做?我正在考慮Oauth登錄可能與事情有關...... –

+0

我做了<%= debug user_signed_in? %>,它返回「--- ...」所以我想這是一個零值呢? –

+0

在您的gem文件中包含gem'ruby-debug'並捆綁它。現在,在你想使用關鍵字調試器的地方,在你的ruby代碼中。所以你的程序會暫停,你可以檢查這些值並做其他操作。 –

0

已解決!

的問題是,application_controller被覆蓋色器件自己的「高清CURRENT_USER」

首先我只是刪除了「高清CURRENT_USER」條目......和普通的登錄工作得很好...但Facebook登錄無效。所以我乾脆改名爲所有的「高清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的方式嗎? :)