2013-06-13 38 views
1

我有名爲name的數據庫字段。我在我的應用程序中使用了user.name。現在我有一些喜歡稱呼的東西,我想追加這個名字。所以我基本上想要的是當我通過user.name訪問名稱時,它應該從實例方法而不是數據庫字段獲取值。訪問Rails時使用實例方法而不是數據庫字段

def name_with_salutation 
"#{salutation} #{name}" 
end 

所以當我通過user.name訪問名稱時,它應該用user.name_with_salutation來響應。我嘗試了alias_method,但它顯示堆棧層次太深,因爲名稱在name_with_salutation中使用,所以它陷入了無限過程。

我想這是因爲我不想在整個應用程序中用name_with_salutation替換名稱。這不應該適用於我分配值user.name =「abc」。

請讓我知道,這將如何完成。

回答

4

要覆蓋原始模型方法,您可以編寫一個具有相同名稱的方法,然後使用read_attribute(:attr)來表示原始屬性值。

鑑於name屬性存在,覆蓋#name

def name 
    "#{salutation} #{read_attribute(:name)}" 
end 
+0

你認爲它是一個好主意,因爲當我們節省了用戶記錄它驗證salutation_with_name而不是name。並且無法獲取原始名稱(必須使用此read_attribute(:name)) – RailsEnthusiast

+0

@ nishant610,我不認爲這是一個好主意。新的#name方法可以幫助您操作輸出,但不打算替換該屬性。在驗證時,尊重任何原始輸入。對於你的第二個問題,是的,是不是你想要做的?如果您不想更改原始#name的行爲,則需要使用不同的名稱編寫新方法,而不是覆蓋它。 –

+0

基本上我必須在視圖結束時向用戶顯示name_with_salutation,並且我無法更新存在於很多位置的數據庫字段和user.name,所以我不想在每個位置使用user.name_with_salutation更改user.name,並且在使用後當我保存記錄時,read_attribute驗證了我不想要的稱呼。我只想出於顯示目的而稱呼。 – RailsEnthusiast

相關問題