0

Ryan Bates Authenticationに関連するRailscastのいずれかを見ていると、sigin / signout機能を作成するときに繰り返し発生するテーマが表示されますが、それをもう少し明確に理解したいと思います。

def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user

たとえば、通常、セッションコントローラではsession[:user_id] = user.id、変数userがアクティブレコードオブジェクトに設定されている場合など、作成アクションにはセッションハッシュへの割り当てが含まれます。

次に、上記のヘルパーメソッドをビュー全体で使用して、現在サインインしているユーザーを検索します。

ただし、サインアウトすると、破棄アクションには次の行のみが含まれますsession[:user_id] = nil

@current_userサインインした前のユーザーに設定されるので、nilに設定する必要もありませんか?

4

1 に答える 1

1

通常session[:user_id] = nil、コントローラーを設定した後は元に戻るため@current_user、アクティブであっても問題ありません。そのリクエストに対してのみ存在することを覚えておく必要があります@current_user。次に来るリクエストは、そのコントローラ クラスの新しいインスタンスです。

あなたがこのようなことをした場合、あなたは正しいです:

def destroy
  session[:user_id] = nil
  logger.debug current_user.inspect  # Current user is still set for this request
  redirect_to admin_url, notice => "You've successfully logged out."
end

ログ ファイルにユーザー情報が表示されますが、通常は、コントローラー インスタンスが完了するように、セッション [:user_id] をクリアした直後にリダイレクトを実行します。

于 2013-02-28T20:45:48.017 に答える