3

私は現在セッションをレビューしていて、以前に使用したかなり一般的なセッションコントローラーに出くわしました。

module SessionsHelper

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

def sign_out
    self.current_user = nil
    cookies[:remember_token] = nil
end

def signed_in?
    !current_user.nil?
end

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

def current_user=(user)
    @current_user = user
end


end

そして、ビューでcurrent_userを何度も使用していることに気づきました。元:

<% if current_user == @user %>
    <%= current_user.name %>
<% else %>
    This user is not you.
<% end %>
  1. current_userただし、インスタンス変数であるかのようにアクセスできる理由がわかりません。それは方法ではありませんか?、、などと同じように扱い、@current_user属性を引き出すことができるのはなぜですか?それはインスタンス変数でのみ可能だと思いました。current_user.namecurrent_user.age

  2. 最初と2番目の方法sign_in(user)sign_outで、何selfを指しますか?これらはクラスメソッドと見なされますよね?

4

1 に答える 1

4
  1. current_userは確かに、SessionHelperその内部インスタンス変数への参照を返すだけで定義されたメソッドです@current_user。このような方法は通常「リーダー」と呼ばれます。戻り値はへの参照であるため@current_user、実際のインスタンス変数であるかのようにその値を使用できます。current_user.name

  2. これらの2つのメソッドの定義では、を使用するself必要があります。これがないと、rubyは、モジュール内で既に定義されてcurrent_userいるメソッドを呼び出すのではなく、メソッド内で呼び出される新しいローカル変数に割り当てると想定するためです。current_user=()この場合self、モジュール自体を指します。

于 2012-11-19T21:30:39.350 に答える