2015-06-01 63 views
0

我有一個模型方法呼叫模型的方法從不同視圖

def full_name_find(user_id) 
    user = User.find(user_id) 
    "#{user.first_name} #{user.last_name}" 
end 

即在User模型。我想從另一個角度(ticket#show)打電話給我,我似乎無法讓它工作。

我想:

<%= User.full_name_find(comment.user_id) %> 

其中評論有USER_ID。我得到undefined method 'full_name_find' for #<Class:0x007fd188e41108>。我只能得到它的工作時,我堅持了full_name_find方法進入應用助手和查看通話爲:

<%= full_name_find(comment.user_id) %> 

和它的作品。有什麼建議?

回答

3

你可以把它通過使一個類的方法,工作即通過把self.其名稱前:

def self.full_name_find(user_id) 
    user = find(user_id) 
    "#{user.first_name} #{user.last_name}" 
end 

User.full_name_find(123) 
# => "Jane Doe" 

...那是很奇怪的。在一個應該返回用戶名的方法中進行數據庫操作(User.find)是沒有意義的。一個更慣用的方法是一個簡單的實例方法,這將使您能夠爲任何用戶例如獲得全名:

class User < ActiveRecord::Base 
    # ... 
    def full_name 
    "#{first_name} #{last_name}" 
    end 
end 

然後,在你的看法:

<%= comment.user.full_name %> 

這是更好出於上述原因(更不用說簡單很多),還因爲當你加載你的評論時,你可以使用includes來加載相關的用戶(例如Comment.where(...).includes(:user)),所以你不必做大量的額外的數據庫請求來獲取用戶的名字。

+0

是的,但我試圖避免寫在每一個我將使用'全名'的視圖。我會在哪裏寫這些方法。 –

+0

避免寫什麼? 'comment.user.full_name'? –