2011-02-08 74 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