2013-05-07 223 views
0

我是Rails的新手,並且一直在經歷Michael Hartl的Rails教程。直到目前爲止,我已經能夠理解教程中的所有內容,但現在我認爲我在第8章的中途停滯不前。我想從更有經驗的Rails程序員那裏得到一些確認,我正確地遵循作者的解釋。我說的是具體低於約Chapter 8, Section 8.2.3Ruby on Rails教程Michael Hartl,第8章,「當前用戶」部分

在第8.2.3節中,「sign_in」方法有行:通過使用,而不是僅僅「CURRENT_USER」,「自我」

self.current_user = user 

因此,CURRENT_USER有已經成爲Session的一部分,但尚未存儲在數據庫中,對嗎?

如果是這樣,Listing 8.22中列出的方法是getter和setter方法,是否正確?第一個將current_user存儲在數據庫中,第二個根據需要檢索它?

最後,getter和setter方法是需要的,因爲它不良的做法暴露方法中的實例變量(在本例中爲「sign_in」)?換句話說,這將是壞的替換:

self.current_user = user 

@current_user = user 

在 「sign_in」 的方法?

我感謝任何幫助和建議。 謝謝。

回答

-1

我不是很精通Rails,但這裏是我的外行對SessionsHelper中方法的理解。

首先,@current_user是模塊SessionsHelper的實例變量。這意味着它持續用於SessionsHelper中方法的後續調用。


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

因此,通過使用「自我」,而不僅僅是「CURRENT_USER」,CURRENT_USER已經取得的會話的一部分,但尚未存儲在數據庫中,是否正確?

self.current_user = user使 'CURRENT_USER' 的任何一個部分。
self是指自己,SessionsHelper
self.current_user =有效地調用它的自己的方法,setter方法,def current_user=(user)


如果是這樣的情況下,上市8.22中列出的方法是getter和 setter方法,正確嗎?

是的。

def current_user=(user) # Setter. 
    @current_user = user 
    end 

率先CURRENT_USER存儲在數據庫中,

號第一種方法,current_user=,確實店什麼到數據庫中。它所做的就是將實例變量@current_user設置爲user


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

和第二檢索它需要?

第二種方法,current_user,返回一個現有@current_user值。
如果@current_usernil(空),它運行

||= User.find_by_remember_token(cookies[:remember_token]) 

來檢索和設置@current_userUser基於瀏覽器的remember_token的cookie數據庫。


最後,需要getter和setter方法,因爲它不好的做法,暴露出的方法的實例變量(在這種情況下,「sign_in」)?

在我看來,getter和setter方法並不是完全需要的。可以在整個幫手中使用@current_user
但是,Devise (a popular user authentication gem)在其助手中使用current_user方法。這個comment也是相關的。


換句話說,這將是壞的替換:self.current_user = user@current_user = user在 「sign_in」 的方法?

@current_user = user替換它應該沒有問題。這個question(與上面鏈接註釋相同的鏈接)顯示了本教程中的功能相同。

相關問題