【问题标题】:Where should I put chart-drawing code in Rails?我应该将图表绘制代码放在 Rails 的什么地方?
【发布时间】:2013-06-12 20:08:35
【问题描述】:

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

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

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

对此有什么普遍看法?

【问题讨论】:

    标签: ruby-on-rails model-view-controller drawing code-organization


    【解决方案1】:

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

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

    ..

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

    【讨论】:

    • 是的,我也想到了这个想法。然而,在这种特殊情况下,它对这个单一用例极为特殊,我几乎可以保证它的“重用价值”大约为 0。
    • ...然而,我认为这仍然是最好的方法。谢谢!
    【解决方案2】:

    IMO:什么都有一点!顺着你的清单往下看:

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

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

    【讨论】:

    • 是的,我正在做后者。我认为将其作为部分执行的问题在于代码最终看起来非常难看。绘制图表(查找坐标、线的斜率等)涉及很多数学运算,并且将这些东西混合到 erb 或 haml 部分中会给我带来威力。在无数小辅助方法之间来回切换并从部分调用它们似乎并没有好多少 - 将所有图表代码保存在一个文件中肯定会很好。
    • 对,但我的意思是,您的视图代码应该使用一些简单的 JSON,例如列出点,然后您的目标代码执行所有繁重的数学运算。如果实际绘图涉及繁重的数学 - 那么您应该使用它制作自己的 Javascript 图表库,或者使用其他人的。那里有很多,有些是免费的,有些不是。
    • 是的,实际的绘图代码涉及大量的数学运算。我用 Ruby 而不是 Javascript 完成了它,因为我在 Ruby 中更舒服。我花了一个小时左右的时间浏览各种图表库(包括几个主要的 Javascript 库),但这是一种特殊类型的图表,看起来要让它们中的任何一个都过早秃顶产生我正在寻找的相当定制的输出。听起来像将绘图代码分解为它自己的一个类(将其粘贴在 lib/ 中)可能是最接近正确的方法。
    • 是的。您还可以查看 Opal,它将 Ruby 编译为 Javascript,但我打赌您会使用会阻止该选项的库。
    猜你喜欢
    • 2014-06-26
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多