2012-11-19 33 views
3

我目前正在審查會議,我碰到一個非常通用的會話控制器我以前用過就來了:扶手:CURRENT_USER和會議澄清

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.name,current_user.age等。我認爲這隻適用於實例變量。

  2. 在第一個和第二個方法sign_in(user)sign_out中,self是指什麼?這些被認爲是正確的類方法?

+1

它可能會幫助初學者認識到current_user.name與current_user().name相同。這只是一個Ruby約定,當沒有參數時從函數調用中刪除括號。這與其他語言非常不同,其中沒有括號的函數名稱不調用函數,而是引用或指向函數的指針(例如,在JavaScript中,'function currentUser(); end; var myFxn = currentUser; var user = myFxn();')。 – MikeJ

回答

4
  1. current_user的確是SessionHelper定義的方法,其恰好返回到其內部實例變量@current_user的引用。這種方法通常被稱爲「讀者」。因爲返回的值是@current_user一個參考,你可以使用這個值就好像它是實際的實例變量,因此current_user.name

  2. 使用的self是必要的,這兩種方法的定義,因爲沒有它,將Ruby假定您想要在方法內部分配一個名爲current_user的新本地變量,而不是調用已在模塊內定義的方法current_user=()。在這種情況下,self指的是模塊本身。

+0

很好的解釋。感謝cdes – Edmund