0

我有一些自定义 Ruby 代码用于根据模型的内容生成图表(通常在“显示”视图中显示为内联 SVG)。

我想知道我应该把绘图代码放在哪里。如我所见,我可以:

  1. 把它放在模型中,这样我就可以@my_object.chart_as_svg在我的视图中调用......但这会与 MVC 不同
  2. 把它放在一个视图中,比如show.svg.erb,让我的控制器响应 format.svg
  3. 将其作为单独的操作放入控制器中
  4. 把它放在一个助手...

这方面的普遍智慧是什么?

4

2 回答 2

1

如果您认为您可以将图表代码重用于其他事情,请将其设为一个类,放入lib并设置它,以便您可以在控制器中执行以下操作:

@chart = MyChart.new(:data => @my_object.data_method, :title => 'Foo Chart', ....)
send_data @chart.to_svg, ...

..

通过这种方式,您可以使用其他选项扩展它,添加.to_png等,而不会破坏您的模型。

于 2013-06-12T20:15:35.740 回答
0

国际海事组织:什么都有一点!往下看你的清单:

  1. 您的对象有图表,所以您绝对应该有图表@obj.chart,但图表不是模型的一部分 - 它可以使用模型数据创建,但它不是 a) 受限于该模型或 b) 该模型所需的东西 -所以你确实希望它作为不同包/模块/对象/等的一部分
  2. 图表的 Ruby 对象,恕我直言,不应该“知道”如何将自己变成 HTML 视图。这是部分的工作 - _chart.svg.erb_chart_typeB.svg.erb- 但它应该“知道”如何转换其信息 - 计数、平均值、百分比等。然后,部分使用这些不同的“格式”。
  3. 我敢打赌,在某个时候,您会希望通过 API 直接访问图表数据。也许你正在把你的东西变成一个平台,也许你正在对当前页面进行 AJAX 更新;没关系 - 您最终将需要一些控制器操作来直接访问图表数据。
  4. 您应该从视图中取出任何复杂的部分并将它们变成助手,但部分仍然应该负责“样式”。也就是说,部分应该生成图表的最小原子视图 - 只是图表,除了图表之外什么都没有 - 但是当您想要在网页中包含图表时,部分应该是您通常想要显示的任何其他内容。

编辑:稍微阅读其他答案,我有一个不同的假设:我假设您获取图表信息并通过网页上的 Javascript 生成图片,而不是在服务器上生成图片并提供图片。如果你在做后者,我会把它作为图表类的一部分——它是一种不同的“格式”,数据可以转换成这种格式。

于 2013-06-12T20:42:20.867 回答