Как программно переопределить форматер таблицы данных Ruport? - PullRequest
1 голос
/ 14 сентября 2011

У меня довольно простая настройка Ruport в моем приложении Rails, где контроллеру 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 ]

1 голос
/ 15 сентября 2011

Документация API Ruport дает понять, что вы можете зарегистрировать одного 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
1 голос
/ 14 сентября 2011

Формататоры 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
...