4

ここでrubyアプリを作成するために、MichaelHartlのすばらしいチュートリアルを実行しています。

私はセッションを作成する方法の概念を理解しようとしていますが、この行を理解するのに行き詰まっています:

self.current_user = user

この方法では:

module SessionsHelper

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

user_tokenを使用してCookieを作成するという概念全体を理解しています。

しかし、私は何を意味するのか理解できず self.current_user = user 、なぜこのコード行を保持する必要があるのですか?トークンを含むCookieを持っています-なぜ現在のユーザーを知る必要があるのですか?

また、この「自己」はどこに保存されていますか?これはflash[:success]、私のビューの1つで見ることができるパラメーターのようなものではありません。だからどこにあるのかわかりません。

同じモジュールには、次の2つのメソッドもあります。

  def current_user=(user)
    @current_user = user
  end

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

それでも私はこの神秘的な目的の点をつなげようとしていますcurrent user-その目的は@current_userビューで使用するグローバル変数を作成することですか?

もしそうなら-なぜこれらの2つの重複した関数がdef current_user=(user)あり、def current_user

4

2 に答える 2

5

いくつかのこと。

まず、メソッド名を間違って読んでいます(これは、ルビーメソッドの名前付けがいかに不可解であるかを考えると驚くことではありません)。def current_user=(user)は実際には引数を取るメソッドを定義するものとして読み取られますcurrent_user=が、引数をとらないメソッドを定義します。これらは、それぞれセッターおよびゲッターと呼ばれます。userdef current_usercurrent_user

参考資料は次のとおりです。Ruby(プログラミング言語):Rubyのセッターとゲッターとは何ですか?

だから、それは重複を説明しています。次の質問に移りましょう。

self.current_user=userの意味がわかりません

selfはそれ自体がトピックであり、それ自体で議論する価値があるので、私はそれを説明しようとさえしません(ここに多くの参照のうちの1つがあります)。この質問の目的のために、インスタンス変数を設定するためにself、クラス内であっても(他の目的では暗黙的である場合)、割り当ての前に。を付ける必要があることを覚えておくことが重要です。行の残りの部分はcurrent_user=、引数を指定して、前述のsetterメソッドを呼び出していますuser

このコード行を保持する必要があるのはなぜですか?トークンを含むCookieがあります-なぜ現在のユーザーを知る必要があるのですか?

必要な理由は、現在のユーザーを取得する必要があるたびにトークンからユーザーを検索したくないためです。getterメソッドを見てください。

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

これが言うことは、インスタンス変数をまだ調べて設定していない場合は@current_user、それを調べてください。すでに設定している場合は、返却してください。それは多くの検索を節約します。

それがあなたの質問に答えると思います。self他の場所でより多くの情報を見つけることができるより深い問題(など)がたくさんあります。selfSOのセッターに含める必要がある理由の1つの説明は、次のとおりです。Rubyセッターに「自己」が必要な理由。クラス内の資格?

更新:selfクラス内でのセッターの使用に関する最後のリンクは、クラスから直接ではなくモジュール内で呼び出しているため、実際には少しトピックから外れています。モジュールのコンテキストでは、selfinself.current_user = userは、モジュールが内部に含まれるクラスになります。たとえばUser.current_user、クラス内で呼び出された場合Userなどです。ここでも、それ自体に関する別のトピックについて説明します。

于 2012-08-15T13:38:44.417 に答える
1

このメソッドdef current_user=(user)は基本的に、sign_inメソッドがcurrent_userを設定するために使用するセッターです。

def current_user@current_userを返すか、設定されていない場合は、remember_tokenによってUsersテーブルで検索されます。これにより、基本的に、任意の時点でcurrent_userを取得できます。

self.current_usersign_inメソッドのコンテキストでは、この場合、呼び出し元のクラスまたはモジュールを参照します。current_userモジュールから呼び出しSession Helperます。

于 2012-08-15T13:49:07.540 に答える