如何以编程方式覆盖Ruport数据表的格式化程序?

时间:2011-09-14 02:11:19

标签: ruby ruport

我在Rails应用程序中有一个非常简单的Ruport设置,其中Ruport控制器被传递Report::Data::Table个实例:

class Reporter < Ruport::Controller
  stage :headline, :data, :footer
  required_option :report

def setup
    report_klass = options.report.report_model
    report_klass ||= Report
    self.data = report_klass.send(:report_table_by_sql, options.report.query)
  end
end

当被要求渲染时,存储在数据中的Data::Table实例使用Ruport::Data::Table作为其委托控制器,这样当我稍后调用

时会调用它
output << data.to_html

如何告诉数据将其呈现方法委托给Reporter类,所以我的所有钩子覆盖都可以存在于一个地方?

2 个答案:

答案 0 :(得分:1)

Ruport格式化程序被设计为封装在一个继承自Formatter的单独类中。 我相信类似的东西会达到你想要的效果:

# Inherits all the default build methods from the HTML Formatter
class ReporterTableHTMLFormatter < Ruport::Formatter::HTML
  # Sets this class to render Ruport Tables
  # (Data instead of Controller may also work, the code path is a bit unclear/overloaded)
  renders :html, :for => Ruport::Controller::Table

  # Build table row
  def build_row(data)
    ...
  end
end

答案 1 :(得分:1)

Ruport的API documentation清楚地表明您可以注册多个Formatter的{​​{1}}个后代,所以如果你想拥有一个实现所有钩子的格式化程序,你可以简单地多说:

Controllers
相关问题