2017-01-28 12 views
1

をログアウトし、同様に@current_userを削除することができsession[:user_id]を削除する方法を私は理解していない:マイケル・ハートル章8.3は、私はマイケル・ハートルのRailsのチュートリアル、章8.3のRubyはセッション</em>をログアウト<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_usernilになります。

誰かが私に力学を説明できますか?

答えて

1

sessionはリクエストの間に存続します。しかし、インスタンス変数@current_userは、1つの要求の長さだけ持続します。 destroyアクションが新しいリクエストの開始であるroot_pathにリダイレクトされると、ルートページがロードされます。

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で終わるかどうか確認する:

は、あなたはとてもセッションのうち、user_idをクリアすると、インスタンス変数をクリアしないことがわかり、これを試してみたいことがあります。 @current_userはまだ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値:nil > @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

    関連する問題