Michael Hartl第8.3章退出会议

时间:2017-01-28 01:44:54

标签: ruby-on-rails ruby session logout railstutorial.org

我正在阅读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>

有人可以向我解释这些机制吗?

1 个答案:

答案 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,但会在请求结束时消失。