Rails - 一个视图中的许多模型

时间:2011-11-23 15:58:52

标签: ruby-on-rails ruby ruby-on-rails-3 model-view-controller ruby-on-rails-3.1

我需要从单个视图访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我是假设),其中显示按分数排序的最高用户(@users = User.all.sort_by(&:score)

我知道我可以将此代码插入每个链接操作并从视图中访问它,但这似乎不是“红宝石方式”,我将需要在不久的将来访问更多模型。这可能变得非常脏,这种情况有什么技巧吗?

注意:

  • 我看到我的应用程序朝着具有动态页面内容的单一格式的方向发展,实质上是一个典型的Web应用程序。
  • 我知道before_filter,但这看起来很麻烦,考虑到我希望应用程序进入的方向。最终从任何视图访问多个模型。

2 个答案:

答案 0 :(得分:5)

这种事情最好被封装为一个由特定部分运用的辅助方法。例如,如果这是您的部分_user_listing.html.erb

<% users_by_score.each do |user| %>
   ...
<% end %>

然后,您将在所有相关控制器包含的帮助文件中实现users_by_score方法,如果它是普遍的,则在ApplicationHelper中实现:

def users_by_score
  User.all.sort_by(&:score)
end

在其他MVC系统中,这将被视为具有自己的控制器的子视图,但在Rails中,您可以做的最好的方法是使用辅助方法。

答案 1 :(得分:3)

有几种方法可以解决这个问题。

我认为控制器是视图和模型之间的粘合剂,控制器应该进行所有数据检索。帮助者只是为了帮助您的视图代码变得更具可读性。

因此,从这个角度来看,有几个选择。

经典Rails方法

我们有一个大型应用程序,其中有一些共享块,与当前页面无关,但对于当前用户,他可以在那里查看他的项目,操作并快速跳转。这些东西都来自数据库。

我们使用before_filter方法检索数据。这些方法在ApplicationController中定义。我们通过将代码(共享行为)混合在一起来保持ApplicationController小。

在我们的application布局中,我们为过滤器之前收集的数据呈现不同的部分。大多数这些块都是固定的并且始终可见。

细胞

我自己没有使用它,但是一个非常干净的解决方案是使用cells。单元格实际上是一种块,具有自己的控制器和视图,可以放在页面上。这听起来非常有趣,如果你有一个带有portlet的门户网站类型,那肯定很有趣(有人知道我的意思吗?我现在感觉太老了;))。

切换到客户端MVC

如果您要切换到单页网页应用程序(如Gmail),那么也可以转换为使用javascript MVC框架。然后,您的页面可以使用不同的区域组成,每个区域都有自己的模型和视图(模板),链接到您的rails控制器。

目前有大量的图书馆,现在每个人似乎都在使用backbone,但如果你选择这条路线,我建议你查看spine.js:它有一个很棒的轨道整合和死亡容易入手。

希望这有帮助。