2011-07-31 2 views
4

Rails 3アプリケーションコントローラーまたはヘルパー内のセッターとゲッターの使い勝手についてちょっと混乱します。 なぜ、インスタンス変数だけでなく、コントローラメソッド(またはモジュール)でセッターとゲッターを使用するのでしょうか。誰かが例を挙げることはできますか? セッターとゲッタを使用するのが賢明ですか?それはいつ必要ですか?例えばRuby on Rails 3:セッターとゲッターとコントローラーメソッドの内部

、マイケル・ハートルによってRailsの3チュートリアルのRubbyは、それは(ページ347)言う:

モジュールSessionsHelper

def current_user=(user) 
@current_user = user 
end 

def current_user 
@current_user ||= user_from_remember_token 
end 

理由だけではなく、最初の場所で@current_userを使用していません。

私の2番目の質問は、コントローラメソッド内の自己の意味です。たとえば :

Class SessionsController < ApplicationController 

def sign_in? 
cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
self.current_user= user 
end 

end 

私はUserモデルクラス内部の自己は、ユーザー自身 を指し、しかし、それはコントローラ内部にあるとき、それが何を参照しないことを知っていますか? 例はありますか?

selfは、コントローラ自体を指し、コントローラ内部であなたに

答えて

5

ありがとうございます。だから、self.current_user = userと言うときは、コントローラー(SessionsHelperモジュールで定義されているように、私が正しく含まれていると仮定します)にcurrent_user=を呼び出しています。

このテクニックは、いくつかの理由でややクリーナーです。

  1. これにより、後で実行する必要がある場合に、現在のユーザーを読み込んだり割り当てたときに追加のロジックを追加することができます。インスタンス変数を使用すると、そのような拡張ポイントは直接提供されません。
  2. current_userが呼び出されたときにuser_from_remember_tokenの結果を計算できますが、それ以外の場合はインスタンス変数@current_userからのキャッシュ結果が返されます。
  3. current_userが他のオブジェクトからコントローラ上で呼び出されることが望ましい場合があります。別のオブジェクト上のインスタンス変数へのアクセスは、これが内部状態(上記のメソッドcurrent_usercurrent_user=のようなメソッドによって変更されることが意図されているため)であるため、扱いにくいです。
関連する問題