【问题标题】:How do I programatically override the formatter of a Ruport data table?如何以编程方式覆盖 Ruport 数据表的格式化程序?
【发布时间】:2011-09-14 02:11:19
【问题描述】:

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

【问题讨论】:

    标签: ruby ruport


    【解决方案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
    

    【讨论】:

    • 我已经知道这一点,但我脑子里缺少的部分是您可以为多个控制器注册格式化程序……谢谢!
    【解决方案2】:

    Ruport 的 API documentation 明确表示您可以注册单个 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      相关资源
      最近更新 更多