【问题标题】:Rails - Many Models in One ViewRails - 一个视图中的多个模型
【发布时间】:2012-01-04 22:13:18
【问题描述】:

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

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

注意事项:

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

【问题讨论】:

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


    【解决方案1】:

    这类事情最好封装为由特定部分执行的辅助方法。例如,如果这是您的部分_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 中,您能做的最好的事情就是拥有辅助方法。

    【讨论】:

    • 使用助手是the best you can do in Rails???这根本不是帮助程序的用途。
    • Helper 对于从视图中抽象出视图逻辑很有用。你对他们有什么看法?
    【解决方案2】:

    有几个选项可以处理这个问题。

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

    因此,有几个选择。

    经典 Rails 方法

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

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

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

    细胞

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

    切换到客户端 MVC

    如果您要切换到单页 Web 应用程序,例如 Gmail,也可能是切换到使用 javascript MVC 框架的好时机。然后可以使用不同的区域组成您的页面,每个区域都有自己的模型和视图(模板),它们链接到您的 Rails 控制器。

    目前有大量的库,这些天似乎每个人都在使用backbone,但是如果你走这条路,我建议你去看看spine.js:它有一个很棒的rails集成并且非常容易开始吧。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      相关资源
      最近更新 更多