1

我在我的 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 类,以便我所有的钩子覆盖都可以放在一个地方?

4

2 回答 2

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
于 2011-09-14T08:51:34.593 回答
1

Ruport 的API 文档清楚地表明您可以Formatter使用 multiple 注册单个后代Controllers,因此如果您想要一个实现所有钩子的单个格式化程序,您可以简单地说:

class DualPurposeFormatter < Ruport::Formatter::HTML
  renders :html, :for => [Reporter, Ruport::Controller::Table]

  #for Reporter controller
  def build_headline
    #...
  end

  #for Ruport::Controller::Table
  def build_row(row_data)
    #...
  end
end
于 2011-09-15T00:12:34.503 回答