2011-09-14 60 views
1

我有一個很直接的Ruport安裝在我的Rails應用程序,其中Ruport控制器傳遞一個Report::Data::Table實例:當記者問到如何以編程方式覆蓋Ruport數據表的格式化程序?

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 

如何判斷數據轉授的渲染方法對記者班,所以我所有的勾覆蓋可以住在一個地方?

回答

1

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 
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 
+0

我已經知道了,但我腦海中缺失的一塊是,你可以註冊格式化多個控制器......謝謝! – andrewdotnich

相關問題