2017-01-28 63 views
1

,我不知道如何去除session[:user_id]可以刪除@current_user還有:邁克爾·哈特爾章8.3登出我經歷邁克爾·哈特爾的<em>on Rails的教程,第8.3章紅寶石註銷會話</em>會議

這裏是SessionController:

class SessionsController < ApplicationController 
    def new 

    end 

    def create 
    user =User.find_by(email: params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
     log_in(user) 
     redirect_to user 
    else 
     #flash.now will only flash once - if a new request or view is rendered,the flash will go away now 
     flash.now[:danger] = 'Invalid email/password combination' 
     render 'new' 
    end 

    end 

    def destroy 

    log_out 
    redirect_to root_path 

    end 

end 

這裏是SessionsHelper的登錄和註銷助手:

module SessionsHelper 

    def log_in(user) 

     session[:user_id] = user.id 
    end 

    def current_user 
     #find the user if @user is not defined yet, or else, just keep the current user 
     #that way we dont have to do a database search every time current_user is called 
     @current_user ||= User.find_by(id: session[:user_id]) 
    end 

    def logged_in? 
     !current_user.nil? 

    end 
    def log_out 
     session.delete(:user_id) 
    end 
end 

我的理解方式是,一旦登錄後定義了@current_user,即使session[:user_id]已被設置爲自己,該變量仍然不會持續保留嗎?

@current_user ||= User.find_by(id: session[:user_id]) 

我沒有意識到刪除了@current_user變量的操作。但是當我在調試器中測試它時,我可以看到一旦有人註銷,@current_user變爲nil

有人可以解釋我的機制嗎?

回答

1

session在請求之間仍然存在。但實例變量@current_user只能保持一個請求的長度。當destroy操作重定向到root_path,這是將加載根頁面的新請求的開始。

你可能想嘗試了這一點,從而看到清除user_id出會話不清除出實例變量:

def destroy 
    # Test code to initialize @current_user 
    current_user 
    Rails.logger.debug("@current_user before: #{@current_user.inspect}") 

    log_out 

    # Test code to check @current_user after updating session 
    Rails.logger.debug("@current_user after: #{@current_user.inspect}") 

    redirect_to root_path 
end 

再檢查什麼log/development.log結束。 仍然會在log_out之後出現,但在請求結束時會消失。

+0

謝謝,這很有用!但是,我試過這個: > def destroy > Rails.logger.debug(「@ current_user value:#{@current_user.inspect}」) log_out > Rails.logger.debug(「@ current_user value:#{@ @ current_user.inspect} 「) redirect_to的root_path 結束 >,但我得到了@current_user是零在兩方面: 處理由SessionsController#摧毀HTML 參數:{」 authenticity_token 「=>」 OjnBcB5CAdUbuGmW68lzlkVqx8B3R7f + 6ZTdUGBj61XC/vuFa9Vp7oAodT6RtkFNVTduPgp0hB5UaMVStJIjGg ==「} > @current_user值:無 > @current_user值:無 看起來像current_user從未設置? – lzhengem

+0

對不起,你說得對。我在我的答案中更新了示例。 'destroy'動作不需要知道當前用戶,所以它從來沒有設置它。任何需要當前用戶的請求都會調用'current_user'輔助方法和'@ current_user',直到請求結束。 – cschroed

+0

好的,我看到謝謝!還有一個跟進問題 - 因此,在我的_header.html.erb部分中,我使用了這個:'

  • <%= link_to「Profile」,current_user%>
  • '哪個應該設置@current_user,對嗎?那麼爲什麼我需要在控制器中再次調用current_user來設置它呢? – lzhengem

    相關問題