直接在Rails中的视图中使用模型

时间:2012-08-08 08:29:57

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个名为“类别”的模型。它只是存储在数据库中的描述列表。现在我希望类别描述出现在下拉列表中。

正确的做法是在我说@categories = Category.all之类的操作中创建一个实例变量,还是直接在视图中使用Category.all

在视图中直接使用模型会有什么缺点/建议?

3 个答案:

答案 0 :(得分:1)

如果仅在视图中调用Category.all一次,则可以直接编写它。否则,最好编写一个帮助程序而不是按照Rails约定创建实例变量。像

这样的东西
def all_categories
  @all_categories ||= Category.all
end

如果在同一视图中多次使用,它会执行单个查询。

答案 1 :(得分:0)

通常的做法是在控制器中为特定于该请求的数据创建实例变量。

对于您的类别示例,直接从视图执行查询是合适的。

可以在该操作的视图中,部分,甚至在布局中,如果它在整个站点中使用。

答案 2 :(得分:0)

一个简单的经验法则是只保存方法结果中的实例变量,如果它可以节省一些代码重复,因为你想要使用两次结果。另一个经验法则是永远不要在视图中调用具有副作用的方法。在这种情况下,您似乎使用的方法没有副作用一次,所以我可以把它放在视图中。

这就是说,在视图中忽略模型方法调用比在控制器中更容易,因为它们与标记元素混合在一起。在您的视图中添加一些也称为Category.all的新代码之前,这可能会导致您忽略您已调用Category.all。而不是在控制器中轻易注意到你有一个Category.all的实例变量,你可能会遇到整个视图或忘记这样做。

使用实例变量的另一个案例是它可以使您的视图更容易重用。您可能希望将对实例变量进行的调用足够通用,以便也适用于可以以类似方式查看的其他模型,而不是将视图紧密耦合到Category类。以这种方式使用实例变量可以帮助您利用Ruby提供的鸭子类型,但是您必须权衡制作通用的简易性与记忆或查找不同类型对象上实际可用的方法类型的努力。这可能在你的实例变量中。