4

Michael Hartl によるRuby on Rails チュートリアルを終了しました。インスタンス変数、ゲッター、セッターに関するいくつかの基本的な考え方を知っています。

sign_in メソッドはこちら

def sign_in(user)
  cookies.permanent[:remember_token] = user.remember_token
  self.current_user = user
end

今、私はこの行で立ち往生しています

self.current_user = user

この関連する質問を見つけましたが、まだわかりません。

sign_in 後、ユーザーは別のページにリダイレクトされるため、@current_usernil になります。@current_userRails は、現在のリクエストで Cookie またはセッションを再度チェックする必要がないように、Cookie またはセッションから current_user を取得してから を設定することしかできません。

Sign_out メソッドで

def sign_out
  self.current_user = nil
  cookies.delete(:remember_token)
end

self.current_user = nil同じ理由で、ユーザーは root_url にリダイレクトされるので、なぜ必要なのですか?

ゲッターとセッターのコードは次のとおりです

def current_user=(user)
  @current_user = user
end

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

3 に答える 3

2

リダイレクト後に @current_user が設定されていないことは正しいです。

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

このステートメントは、データベースへの呼び出しの繰り返しを回避するのに役立ちますが、current_user 変数が単一のユーザー要求に対して複数回使用される場合にのみ役立ちます。したがって、現在のユーザーの設定は、1 回の通話中にのみ役立ちます。

同様に、現在のユーザーを nil に設定し、sign_out 中に Cookie からトークンを削除すると、後続の処理でサインアウトが考慮されるようになります。そうしないと、他のメソッドが現在のユーザー変数を参照し、ユーザーがまだログインしていると考えるリスクがあります。

于 2012-12-26T10:57:28.967 に答える
1

これまでに作成したコードについては、それほど大きな違いはないと言っているのは正しいと思います。

ただし、sign_in/sign_out メソッドが、ユーザーがアプリケーションをどのように通過するかを知ることは意味がありません。ログイン後にアプリケーションが行う唯一のことは、ユーザーをルートページにリダイレクトすることであると想定すると、非常に脆弱になります (そしてそのビジネスではありません)。

監査データの収集 (たとえば、誰かがログインするたびに記録) から、ユーザーの設定やユーザーのその他の属性に応じて別のページにリダイレクトすることまで、あらゆる種類のことを行うことができます。

于 2012-12-26T10:44:01.307 に答える
1

本の次のセクションに完全な説明があります

現在の使用者

基本的に、self.current_user= を実行するときは、'def current_user= ()' メソッドを呼び出します。これはセッターです。おそらく、ここで @current_user 変数を割り当てるだけでなく、将来の参照のために Cookie またはセッションに参照を保持することになります。同様に、次のようなアクセサーを作成することになるでしょう。

def current_user
  @current_user ||= get_user_from_cookies
end

現在のユーザーにアクセスできるようにするため。この本は、Web 開発に慣れていないユーザーのために、一歩一歩進めようとしていると思います。

于 2012-12-26T10:17:53.940 に答える