2011-07-31 21 views
4

Iam對Rails 3應用程序控制器或幫助器中setter和getters的可用性有點困惑。 爲什麼有人在控制器方法(或模塊)中使用setter和getters,而不僅僅是一個實例變量。有人可以舉個例子嗎? 使用setter和getters是明智嗎?何時需要?Ruby on Rails 3:Setters和Getters以及控制器方法中的自我

例如,幾度夕陽紅on Rails的3教程由邁克爾·哈特爾,它說(頁347):

模塊SessionsHelper

def current_user=(user) 
@current_user = user 
end 

def current_user 
@current_user ||= user_from_remember_token 
end 

爲什麼不首先使用@current_user

我的第二個問題是控制器方法中自我的含義是什麼。 例如:

Class SessionsController < ApplicationController 

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

end 

我知道用戶模型類中的自我是指用戶自己 但是,當它是一個控制器內這是什麼指什麼? 任何示例?

謝謝

回答

5

內部控制器,self指控制器本身。所以當你說self.current_user = user時,你在控制器上調用current_user=(正如在SessionsHelper模塊中所定義的那樣,我認爲它被正確包含)。

這種技術有點乾淨,原因有幾個。

  1. 它允許您在稍後時間點讀取或分配當前用戶時添加其他邏輯。使用實例變量直接不提供這樣的擴展點。
  2. 它允許在第一次調用current_user時計算user_from_remember_token的結果,但是將返回實例變量@current_user的緩存結果,否則返回。
  3. current_user可能需要在控制器上從某個其他對象調用。在另一個對象上訪問實例變量很笨拙,因爲這應該是內部狀態(它可以通過上面的方法current_usercurrent_user=來修改)。
相關問題