我正在阅读Michael Hartl的 Ruby on Rails教程,第8.3章退出会话,我不明白删除session[:user_id]
如何删除@current_user
以及:
这是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
变为<android.support.v7.widget.CardView
android:id="@+id/cardView"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
app:cardCornerRadius="20dp"
app:cardElevation="@dimen/activity_vertical_margin"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vehicle_selection_single_item_layout"
android:layout_width="100dp"
android:layout_height="150dp"
android:orientation="vertical"
android:layoutMode="clipBounds"
android:padding="5dp">
<ImageView
android:id="@+id/single_item_image_view"
android:src="@drawable/car"
android:layout_width="match_parent"
android:layout_height="100dp" />
<TextView
android:id="@+id/single_item_text_view"
android:layout_width="100dp"
android:layout_height="50dp"
android:text="Car"
android:textSize="15sp"
android:layout_marginStart="2dp"
android:textStyle="bold"
android:textColor="@color/navy_blue"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
。
有人可以向我解释这些机制吗?
答案 0 :(得分: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
中的内容。在@current_user
之后,log_out
仍会出现get_or_create
,但会在请求结束时消失。