2014-01-22 45 views
0

我最近一直在使用rails來完成一個新項目,並試圖儘可能地組織它。人們說你不應該做的一件事就是直接在視圖中使用模型。在助手中使用模型是否正確?

但是我有一個需要被拖入視圖中的項目的各種列表,並具有實例變量像一個長長的清單,似乎毫無意義:

@admin_list = User.all.map {|x| {id: x.id, name:x.name}} 

所以我把上面成一個輔助方法:

def admin_user_list 
    User.all.map {|x| {id: x.id, name:x.name}} 
end 

我應該在輔助類中使用模型嗎?

+0

我個人比較喜歡裝飾這樣的任務。 – dennis

回答

1

是的,很好,但是如果你發現自己使用大量的方法作爲助手,考慮把它們組織成一個單獨的類,作爲「演示者」類或「計算」類。如果你有一個確定的應用程序在哪裏的地圖,那麼繼續前進。

無論哪種方式,你是正確的,你不應該在定義實例變量時使用像map這樣的方法。 (我相信這是在控制器中定義爲這樣的?)

無論如何,如果你希望你在上面指定做什麼,

def admin_user_list 
    User.all.map {|x| {id: x.id, name:x.name}} 
end 

確實應該(在用戶模式):

def self.admin_user_list 
    all.map {|x| {id: x.id, name:x.name}} 
end 

否則你將被調用

用戶= User.find(1)

user.admin_user_list,除非有用戶特定的管理列表,否則這種方式沒有任何意義,在這種情況下,我會收回我的語句。

一個單獨的類的實例:

class Admin 
def user_list 
    User.all.map {|x| {id: x.id, name:x.name}} 
end 

@admin_list = Admin.user_list 
3

這是一個非常自以爲是的問題,但我個人將它定義爲對用戶類的類方法,並把它作爲User.admin_list

在一個注意你應該問問你自己是否真的需要把你的對象映射成像你一樣的散列。

+0

'在旁註中,您應該問自己,是否真的需要將您的對象映射到散列中,就像您正在做的那樣。' 不確定在這種情況下還需要做什麼,因爲我只想要ID和名稱 – andy

+0

使用滿目的?我沒有看到任何理由,你應該把它的狀態變成一個散列,因爲你只使用它的屬性的一個子集。 –

+0

好點。一個愚蠢的時刻哈哈 – andy

0

您應該避免在輔助類中使用模型。 你可以做2件事情...... 1.)首先你可以使用模型類方法,並按照Niels B的建議調用User.admin_list,但是我不會建議使用它,因爲它需要提到模型類名User in查看代碼。 2)你應該在控制器中編寫一個方法,並聲明作爲一個輔助方法,這將允許你直接調用helper方法而不用提到模型類的名字。像下面的東西...

class ApplicationController < ActionController::Base 
helper_method :admin_list 

def admin_list 
    User.all.map {|x| {id: x.id, name:x.name}} 
end 
end 
+0

我沒有告訴他在視圖中引用這個類。控制器中的'@admin_hashes = User.admin_list'適用於我。然而,我並不喜歡將模型實例映射到散列。 –

相關問題