Rails仪表板设计:每个div一个控制器动作

Kev*_*eil 12 ruby model-view-controller dashboard ruby-on-rails

我正在实现一个仪表板作为相对Rails新手(更多的基础设施人).仪表板将包含多个页面,每个页面将包含多个图表/表格等.对于模块化,我希望它尽可能简单地添加新图表或更改数据视图.

假设一页有5个不同的图表.我可以让控制器执行5次单独的数据查找,将所有相关数据保存在实例变量中,并渲染5个部分,每个部分触摸数据的子集.但似乎更模块化的是有一个"索引"控制器动作,其渲染具有一堆div,并且对于每个div,还有另一个控制器动作,它执行数据查找并具有部分负责管理该数据视图的关联视图在div内.

所以,如果我展示它有两个图的网站仪表盘页面,website/index会使用website/graph1website/graph2查找每一个,然后将数据_graph1.html.erb_graph2.html.erb将使用控制器的数据填写申报单"graph1""graph2"

这是正确的设计,如果是这样,最简单的方法是什么?我有使用近似remote_function:action => "graph1"填写申报单,但我很高兴它不是100%.我怀疑我错过了Rails会为我做的更容易的事情.

Sai*_*Sai 10

版本1:

我实际上在生产中使用的简单方法:iframes.

大多数情况下,如果页面一次性呈现并直接来自服务器,您实际上并不关心,实际上它最好是交错加载.

如果您只是将iframe src添加到控制器的show动作中,那么您将拥有一个非常简单的解决方案,不需要直接的跨控制器交互.

优点:

  • 死得很轻松
  • 适用于现有的节目动作等
  • 甚至可能更快,取决于并行与顺序请求和内存负载等的节省

缺点:

  • 你不能总是轻松地将页面与任何它一起保存
  • iframe将突破主机页面的javascript命名空间,所以如果他们需要,你可能需要给他们自己的简约布局; 他们也无法影响iframe之外的周边网页
  • 可能会慢一些,具体取决于ping时间等
  • 如果页面上有许多这样的模块,那么潜在的n + 1效率错误

版本2:

使用JS调用做同样的事情来替换div的部分,àla:

<div id="placeholder">
<%= update_page {|page| page['placeholder'].replace with some partial call here } %>
Run Code Online (Sandbox Code Playgroud)

与上述相同,除了:

优点:

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

缺点:

  • 需要JS和占位符div; 有点复杂

版本3:

召唤一大堆部分人.一旦你谈论仪表板等各个模块都有大量设置逻辑的事情,那么这很复杂.

有很多种方法可以通过将这些东西变成'mixins'之类来解决这个问题,但是IMO它们有点像kludgy.

ETA:通过mixins来实现它的方法是创建一个实际上是一个库文件来实现模块控制器的设置功能,包括那些调用'em'的地方,并调用它们.

但是,这有缺点:

  • 您必须知道哪些顶级控制器操作将导致包含这些模块的页面(如果这些模块实际上可能出现的小部件,例如依赖于用户偏好,那么您可能不容易这些模块)
  • 它并不真正充当一个完整的控制器
  • 它仍然混合了很多逻辑,你的持有物需要知道它所持有的东西
  • 你不能轻易将它分隔成自己的控制器,因为它需要在库类型的文件/ mixin中

可以从另一个控制器调用一个控制器中的方法.然而,这是屁股上的一个主要痛苦,也是一个主要的问题.你应该考虑这样做的唯一一次是a)他们在自己的权利中都是独立必要的控制者,而b)它必须完全在后端运作.

我曾经不得不这样做 - 主要是因为重构它的原因甚至更加痛苦 - 而且我保证除非你必须这样做,否则你不想去那里.

摘要

最好的方法IMHO是第一个,如果你有足够复杂的东西,他们需要重要的设置 - 一个简单的iframe显示模块,传递参数告诉它使用超极简主义布局(只是CSS + JS标题),因为它没有显示作为自己的页面.

这使您可以保持事物完全独立,功能或多或少,就好像它们是完全正常的控制器(布局设置除外),保持正常路线等.

如果你不需要重要的设置,那么只需使用partials,并将他们需要的任何东西作为局部变量传递.如果你遇到像n + 1效率错误这样的事情,这将开始变得脆弱,但......


小智 7

为什么不试试Apotomo,这是Rails的有状态小部件:

如何构建简单仪表板的教程