将控制器代码添加到视图中总是不好的吗?

时间:2011-02-08 05:22:32

标签: ruby-on-rails

我知道,一般来说,在视图中包含控制器代码并不是一个好主意。但是,有什么情况不完全正确吗?例如,这个例子怎么样:

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

在这个例子中,我需要获得多个角色(管理员,用户和更多)的职业成本。因此,有许多像上面这样的链接。现在的问题是这样做的最佳做法是什么。我可以想到3种方式:

  1. 如上图所示。

  2. 使用帮助器并获得成本(缺点 - 无论如何我都需要模型中的get_profession_cost函数,因为我在控制器中使用它;因此,帮助器对我来说似乎有点多余)。此外,我还有一个帮助器作为代码应该在控制器中。无论如何。

  3. 获取预先安排的哈希,例如:

  4. 用户=&gt; 1000,Admin =&gt; 3000 ......等等。这样做更麻烦,而且创建起来有点乏味。

    我真的很想你的意见。有没有更好的方法,如果没有,你更喜欢哪一个?

2 个答案:

答案 0 :(得分:5)

我的偏好顺序始终是

  1. 模型
  2. 辅助
  3. 控制器
  4. 查看
  5. 你的模型上有一个方法很好。我会说更进一步,在你的模型上添加一个类方法,获取所有专业成本的哈希值。这样做的好处是你可以做一个单独的数据库查询(将被缓存),而不是每个职业一个。保持你的控制器尽可能瘦。

    然后,您可以在控制器中的每个位置获取所需的哈希值(或者使用过滤器将其添加到很多地方)。

    我还会添加一个生成字符串的帮助器(不仅仅是数字)

    (costs 12 gold) 
    

    如果多次使用。

答案 1 :(得分:0)

我会尝试在控制器中包含所有计算。

何时在视图中包含Ruby代码的示例可以是:

- if boolean_2
    % some_html
-if boolean_2
    % other_html

(Haml语法)

布尔值1和2将在控制器中设置,视图将仅使用结果。

当然,对于上面例子中的少量代码,它可能并不重要。通常我会在控制器中保留尽可能多的方法调用,并在视图和控制器之间传递散列。

只是我的意见。