我需要从单个视图访问多个模型。以前,我的links_controller
仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我是假设),其中显示按分数排序的最高用户(@users = User.all.sort_by(&:score)
)
我知道我可以将此代码插入每个链接操作并从视图中访问它,但这似乎不是“红宝石方式”,我将需要在不久的将来访问更多模型。这可能变得非常脏,这种情况有什么技巧吗?
注意:
答案 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)
有几种方法可以解决这个问题。
我认为控制器是视图和模型之间的粘合剂,控制器应该进行所有数据检索。帮助者只是为了帮助您的视图代码变得更具可读性。
因此,从这个角度来看,有几个选择。
我们有一个大型应用程序,其中有一些共享块,与当前页面无关,但对于当前用户,他可以在那里查看他的项目,操作并快速跳转。这些东西都来自数据库。
我们使用before_filter
方法检索数据。这些方法在ApplicationController
中定义。我们通过将代码(共享行为)混合在一起来保持ApplicationController
小。
在我们的application
布局中,我们为过滤器之前收集的数据呈现不同的部分。大多数这些块都是固定的并且始终可见。
我自己没有使用它,但是一个非常干净的解决方案是使用cells。单元格实际上是一种块,具有自己的控制器和视图,可以放在页面上。这听起来非常有趣,如果你有一个带有portlet的门户网站类型,那肯定很有趣(有人知道我的意思吗?我现在感觉太老了;))。
如果您要切换到单页网页应用程序(如Gmail),那么也可以转换为使用javascript MVC框架。然后,您的页面可以使用不同的区域组成,每个区域都有自己的模型和视图(模板),链接到您的rails控制器。
目前有大量的图书馆,现在每个人似乎都在使用backbone,但如果你选择这条路线,我建议你查看spine.js:它有一个很棒的轨道整合和死亡容易入手。
希望这有帮助。