,我不知道如何去除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
。
有人可以解釋我的機制嗎?
謝謝,這很有用!但是,我試過這個: > 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
對不起,你說得對。我在我的答案中更新了示例。 'destroy'動作不需要知道當前用戶,所以它從來沒有設置它。任何需要當前用戶的請求都會調用'current_user'輔助方法和'@ current_user',直到請求結束。 – cschroed
好的,我看到謝謝!還有一個跟進問題 - 因此,在我的_header.html.erb部分中,我使用了這個:'