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のAPIドキュメントFormatterでは、単一の子孫を複数のに登録できることが明確になっている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 に答える
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 に答える