2012-12-26 56 views
3

我已完成Michael Hartl的Ruby on Rails Tutorial。我知道一些關於實例變量,getters和setter的基本概念。Rails - 爲什麼在sign_in方法中使用self.current_user = user

的sign_in方法是here

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

現在我被困在這條線

self.current_user = user 

我發現這個相關question,但我還是不明白這一點。

sign_in後,用戶將被重定向到另一個頁面,所以@current_user將爲零。 Rails只能從cookie或會話中獲取current_user,然後設置@current_user,以便它不需要在當前請求中再次檢查cookie或會話。

在SIGN_OUT方法

def sign_out 
    self.current_user = nil 
    cookies.delete(:remember_token) 
end 

出於同樣的理由,我們爲什麼需要self.current_user = nil因爲用戶會被重定向到root_url?

這裏有一個getter和setter代碼

def current_user=(user) 
    @current_user = user 
end 

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

回答

1

你是對的@current_user重定向後沒有設置。

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

這一聲明有助於避免重複調用數據庫,但是如果CURRENT_USER變量被多次使用單個用戶的請求時纔有用。因此,設置當前用戶僅在單次呼叫期間有用。

同樣,將當前用戶設置爲零,並在sign_out期間從cookie中刪除令牌,可確保後續處理將考慮簽出。否則,存在其他方法引用當前用戶變量並且認爲用戶仍然登錄的風險。

0

你對本書的下部分

Current User

基本上當你做self.current_user一個完整的解釋=你invoque的方法'def current_user =()'這是setter,你可能不僅會在這裏分配@current_user變量,還會在cookie或會話中保留一些引用以備將來參考。以同樣的方式你可能會創建一個訪問器看起來像

def current_user 
    @current_user ||= get_user_from_cookies 
end 

爲了有入店當前用戶。我認爲你只是走得很快,這本書試圖一步一步走向不熟悉web dev的用戶。

+0

謝謝,但我有點困惑。我已經在'sign_in'方法中將這個標記放入cookie中,所以我不知道在setter中做什麼。 – greenmoon55

+0

那麼你不必做任何事情,可能作者把它作爲一個setter,因爲很可能你會想在設置當前用戶時做各種事情,或者可能只是一種解釋如何覆蓋setter的方法 –

0

我相信你是對的,因爲你寫的代碼到目前爲止它沒有有很大的不同。

但是,對於您的sign_in/sign_out方法來說,瞭解用戶在您的應用程序中的傳播方式是沒有意義的。如果它假定你的應用程序在登錄後唯一做的事情就是將用戶重定向到根頁面,那將會非常脆弱(而不是它的業務)。

您可能會做各種各樣的事情,從收集審計數據(例如每次有人登錄時記錄)到根據用戶首選項或用戶的某些其他屬性將其重定向到其他頁面。

+0

現在我將用戶重定向到主頁或在SessionsController#create中執行其他操作。這些代碼不在sign_in/sign_out方法中。 – greenmoon55

相關問題