2014-10-29 65 views
0

在Rails教程的第8章中,定義了四種方法。一個被稱爲記住(列表8.32)沒有參數,另一個被稱爲記住(用戶)(列表8.35)。然後有一個方法叫做忘記(列表8.38),沒有參數,還有一個忘記(用戶)方法(列表8.39)。Rails教程:重複的方法名稱,記住並記住(用戶),忘記和忘記(用戶)

我理解認證機制背後的邏輯,我沒有得到的是爲什麼這些方法對之間沒有衝突或相互衝突,具有相同的名稱,也就是說。

是因爲一種方法沒有參數傳遞給它,另一個需要一個?這是Rails如何區分它們嗎?或者是其他事情正在進行,以便Rails知道調用哪種方法。

在此先感謝您的幫助。

更新:由於在評論一個建議,我會在這裏重現代碼:

在文件user.rb這是用戶模型中,有以下方法:


def remember 
    self.remember_token = User.new_token 
    update_attribute(:remember_digest, User.digest(remember_token)) 
end 
... 
def forget 
    update_attribute(:remember_digest, nil) 
end 
... 

和文件中sessions_helper.rb,這是在爲會話模式的助手居住,筆者定義了這兩種方法:


    def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
    end 

    def forget(user) 
    user.forget 
    cookies.delete(:user_id) 
    cookies.delete(:remember_token) 
    end 

讓我煩惱的是,即使有兩個名稱相同的方法(即使一個不接受參數,另一個接受一個,用戶),代碼也能正常工作。

我必須補充說session_helper.rb包含在Application Helper文件中,所以它們是通用的。

+0

你可以發佈一些令你煩惱的代碼,以便我們看看究竟發生了什麼嗎? – Surya 2014-10-29 18:54:53

+0

感謝您的建議。我編輯了問題以包含代碼。 – CesLop 2014-10-29 20:40:41

回答

0

如果在一個類中定義了幾個具有相同名稱的方法,則Ruby不支持方法重寫 - 最新覆蓋了以前的定義。

在這種情況下,user.rb中的方法只能通過用戶對象訪問/調用。

def remember(user) 
    user.remember // invoked by user object 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
end 

你會發現,如果你發送一個非用戶對象的helper方法,它會返回一個錯誤,因爲這方法只能由用戶對象進行訪問。

如果您要在單獨的類中定義具有相同名稱的方法,則它們的工作原理相同,因爲它們只能通過相應的類訪問。

如果您要將您的幫助程序包含在控制器中並在控制器中添加一個名稱與助手方法相同的方法,那麼您的控制器方法會覆蓋前一個方法。這與在同一控制器中添加兩個具有相同名稱的方法相同。如上所述,Ruby不允許覆蓋方法。

+0

非常感謝您的解釋! – CesLop 2014-10-30 20:51:06

0

forgetUser類的實例方法。
forget(user)SessionsHelper模塊的實例方法。

是的。SessionsHelper包含在ApplicationHelper之前,但User類不從其中繼承。

這就是爲什麼這兩個實例方法之間沒有衝突。它們只是不同範圍中具有相同名稱的不同實例方法。