Ruby on rails Rails仪表板设计:每个分区一个控制器操作

Ruby on rails Rails仪表板设计:每个分区一个控制器操作,ruby-on-rails,ruby,model-view-controller,dashboard,Ruby On Rails,Ruby,Model View Controller,Dashboard,我以Rails新手的身份实现了一个仪表板(更像是一个基础设施人员)。仪表板将由多个页面组成,每个页面将包含多个图表/表格等。为了模块化,我希望能够尽可能轻松地添加新图表或更改数据视图 假设一页有5个不同的图表。我可以让控制器做5个单独的数据查找,保存实例变量中的所有相关数据,并呈现5个部分,每个部分都涉及数据的子集。但似乎更模块化的是,有一个“索引”控制器操作,其呈现有一组div,对于每个div,还有另一个控制器操作,它执行数据查找,并有一个关联的视图部分负责管理div中该数据的视图 因此,如果

我以Rails新手的身份实现了一个仪表板(更像是一个基础设施人员)。仪表板将由多个页面组成,每个页面将包含多个图表/表格等。为了模块化,我希望能够尽可能轻松地添加新图表或更改数据视图

假设一页有5个不同的图表。我可以让控制器做5个单独的数据查找,保存实例变量中的所有相关数据,并呈现5个部分,每个部分都涉及数据的子集。但似乎更模块化的是,有一个“索引”控制器操作,其呈现有一组div,对于每个div,还有另一个控制器操作,它执行数据查找,并有一个关联的视图部分负责管理div中该数据的视图

因此,如果我显示有两个图形的网站仪表板页面,
website/index
将使用
website/graph1
website/graph2
查找每个图形的数据,然后
\u graph1.html.erb
\u graph2.html.erb
将使用控制器数据填写divs
“graph1”
“图形2”


这是正确的设计吗?如果是的话,最简单的方法是什么?我使用
远程函数
:action=>“图1得到了一个近似值“
填写div,但我不是100%满意。我怀疑我错过了Rails可以为我做的更简单的事情。

我不知道Rails有什么特殊的技巧可以在不使用AJAX的情况下实现这一点

获得所需模块化的最简单方法是将控制器代码的这些部分放入单独的方法(例如,
设置图1\u数据
设置图2\u数据
,等等),您只需从
索引
操作调用这些方法即可设置视图的变量

如果希望这些方法可用于多个控制器,则可以将其放入ApplicationController中


作为补充说明,早期Rails确实有一个名为“组件”的特性,它允许您完全按照这里的要求来做,而不必使用AJAX。从您的视图中,您可以只渲染另一个控制器操作,内联。但是,出于性能和设计理念的原因,此功能已被删除。

您可以使用

render\u output=render:action=>“graph2”

但我个人可能会将代码包装在共享帮助器中,或者在lib目录下编写您自己的“lib”,以便将代码与共享模板一起重用。请记住,除非更改route.rb文件,否则定义的任何公共方法都可以由

/控制器/操作/:id

还要记住关闭函数的布局:layout=>nil(或在控制器布局的顶部指定“graph”,:except=>[“graph2”]

干杯

基督教

第1版: 我在生产中实际使用过的简单方法:iframes

大多数情况下,您实际上并不关心页面是否一次呈现所有内容并直接从服务器呈现,实际上最好是交错加载

如果您只是将iframe src'd放到控制器的show动作中,那么您就有了一个非常简单的解决方案,它不需要直接的跨控制器交互

赞成者:

  • 非常容易
  • 与现有表演动作等配合使用
  • 甚至可能更快,这取决于并行请求与顺序请求以及内存负载等节省
缺点:

  • 您不能总是轻松地将页面与任何内容一起保存
  • iframe将突破宿主页面的javascript命名空间,因此如果它们需要,您可能需要为它们提供自己的最小布局;它们也无法影响iframe之外的周围页面
  • 可能较慢,具体取决于ping时间等
  • 如果一个页面上有许多这样的模块,则可能存在n+1效率缺陷
第2版: 使用JS调用将div替换为partial,la,执行同样的操作:

<div id="placeholder">
<%= update_page {|page| page['placeholder'].replace with some partial call here } %>

同上,但以下情况除外:

赞成者:

  • 不会将其锁定到iframe中,因此共享JS上下文等
  • 允许更好地处理故障案例
反对:

  • 需要JS和占位符div;有点复杂
第3版: 调用一大堆partials。但是,一旦你谈到诸如仪表板之类的东西,其中各个模块都有大量的设置逻辑,那么这样做就变得复杂了

有很多方法可以通过把这些东西做成“混合”之类的东西来解决这个问题,但在我看来,它们有点笨拙

ETA:通过mixin实现这一点的方法是创建一个基本上是实现模块控制器设置功能的库文件,包括在使用调用它们的东西的任何地方,并调用它们

然而,这也有缺点:

  • 您必须知道哪些顶级控制器操作将导致包含这些模块的页面(如果这些模块非常复杂,可能会到处出现,您可能不太容易看到,例如,依赖于用户偏好)
  • 它并不是一个完全成熟的控制器
  • 它仍然混合了很多逻辑,你的持有物需要知道它持有的东西
  • 您不能轻易地将其隔离到自己的控制器中,因为它需要位于库类型文件/mixin中
可以从另一个控制器调用一个控制器中的方法。然而,它是驴的一个主要的痛苦,也是一个主要的笨拙的工具。你唯一应该考虑的是,如果A)它们都是他们自己的独立的必要控制器,B)它必须完全在后端发挥作用。 我不得不这样做一次——主要是因为重构它的原因更加痛苦——我保证,除非你不得不这样做,否则你不会想去那里

总结