1

みなさん!最近、MichaelHartleのRoRチュートリアルに取り組んでいます。第8章で、私は2日間私を混乱させた1つの問題に遭遇します。ここに問題があります。セクション8.2.3。

module SessionsHelper

  def sign_in(user)
    .
    .
    .
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user     # Useless! Don't use this line.
  end
end

そしてマイケルはこう書いています:

これを行うと、セクション4.4.5.5で見たattr_accessorの機能を効果的に複製できます。問題は、問題の解決に完全に失敗することです。リスト8.21のコードでは、ユーザーのサインインステータスが忘れられます。ユーザーが別のページ(poof!)に移動するとすぐにセッションが終了し、ユーザーは自動的にサインアウトします。この問題を回避するために、リスト8.22に示すように、リスト8.19のコードによって作成されたrememberトークンに対応するユーザーを見つけることができます。

リスト8.22。

module SessionsHelper
  .
  .
  .
  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end
end

私の質問は次のとおりです。ユーザーが新しいページに移動したときに、以前のコードでセッションが自動的にログアウトされるのはなぜですか?なぜ2番目のコードはそうではないのですか?ユーザーがログインしている限り、@ current_userの値は、明示的にログアウトするまで常に「user」になると思いますよね?

4

2 に答える 2

2

前のコードは、後続の要求でユーザーを再作成しないため、ユーザーをあまりログアウトしません。

状態はリクエスト間で共有されず、リクエストごとに再作成する必要があります。@current_userはインスタンス変数であり、単一のリクエストの間、その値を保持します。

@current_user状態が共有されていないという事実を回避するには、リクエストごとに、セッション全体で共通のものなどから必要な変数をリロードする必要があります。この場合、それらはremember_tokenCookie を使用しています。

コードの最初のスニペットは@current_userリクエストごとにリロードされないため、ユーザーがログイン後に別のページを参照するとすぐに保持されていた値が忘れられ、2 番目のスニペットはremember_tokenCookieを介して現在のユーザーをロードしようとします。誰かがログインしたときに設定され、その Cookie が期限切れになるまでユーザーを記憶する必要があります。

于 2012-08-22T02:34:33.447 に答える
1

彼がここで言っているのは、最初の例でサインイン ページ以外で @current_user を使用する場合、@current_user = User.find(1) を呼び出していないということです。すでに設定されていることに依存しています。@current_user を明示的に設定していないため、次のようになります。

@current_user ||= User.find_by_remember_token(cookies[:remember_token])

@current_user が設定されていない場合は、Cookie に保存されている ID を使用してユーザーを見つけて設定します。そうすれば、@current_user を明示的に設定していないページに移動すると、データが入力されます。

于 2012-08-22T02:35:15.637 に答える