2011-02-08 78 views
2

我知道一般來說,在視圖中包含控制器代碼並不是一個好主意。但是,有沒有這種情況並非完全正確?舉例來說,你看這個例子:將控制器代碼添加到視圖總是不好的?

<%= link_to "Upgrade (costs #{ Skill.get_profession_cost('Admin')} gold)" ... 

在這個例子中,我需要得到行業的成本超過一個角色(管理員,用戶和更多)。因此,像上面那樣有很多鏈接。現在問題是做這件事的最佳做法是什麼。我可以想到3種方法:

  1. 正如上圖所示。 (缺點 - 我需要模型中的get_profession_cost函數,因爲我在控制器中使用它;因此,幫助器似乎對我有點冗餘)。此外,我有點認爲助手應該是在控制器中的代碼。

  2. 獲取事先商定的哈希值,如:

用戶=> 1000,聯繫=> 3000 ...等等。儘管這樣做比較麻煩,但也很麻煩。

我真的很喜歡你的意見。有沒有更好的辦法,如果沒有,你會選擇哪一個?

回答

5

我的優先順序總是

  1. 型號
  2. 助手
  3. 控制器
  4. 查看

這是很好的,你已經得到了你的模型的方法。我會說更進一步,並在您的模型中添加一個類方法,獲得所有行業成本的散列。這樣做的好處是你可以做一個數據庫查詢(這將被緩存),而不是每個專業的查詢。儘可能讓你的控制器儘可能瘦。

然後,你可以在你需要的控制器的每個地方獲得散列(或使用過濾器將它添加到很多地方)。

我還是補充說,產生如果多次使用的字符串(不只是數)

(costs 12 gold) 

一個幫手。

+0

好極了,所以看起來確實在視圖中添加這樣的代碼並不是什麼好主意。我會和哈希一起去嘗試不惜一切代價保持我的觀點:) Thanx! – Spyros 2011-02-08 08:12:10

0

我會嘗試幷包含控制器內的所有計算。

的時包括在視圖中Ruby代碼的示例可以是:

- if boolean_2 
    % some_html 
-if boolean_2 
    % other_html 

(Haml的語法)

布爾值1和2將在控制器進行設置,該視圖也只是使使用結果。

當然,對於上面例子中的少量代碼,它可能並不重要。通常我會在控制器中保持儘可能多的方法調用,並在視圖和控制器之間傳遞哈希值。

只是我的意見。

+0

感謝您的回覆,我想我會堅持在我的模型中編寫代碼:) – Spyros 2011-02-08 08:12:41