1

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

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

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

4

3 回答 3

1

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

def all_categories
  @all_categories ||= Category.all
end

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

于 2012-08-08T11:01:26.357 回答
0

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

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

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

于 2012-08-08T10:30:51.530 回答
0

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

对于您的 Category 示例,直接从视图进行查询是合适的。

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

于 2012-08-08T08:39:25.233 回答