RUBY RUPORT實踐—Ruport::Controller及Template應用

來源:互聯網
上載者:User

開發環境:

OS:WindowsXP

Ruby:Ruby1.8.7

Rails:Rails2.3.5

Mysql:Mysql5.0.9

IDE:Rubymine2.0.1

 

一、建立ProductAggragator,實現資料幫浦邏輯,本例中將Product.report_table的部分參數做了動態傳參處理

class ProductAggregator<br /> #Code here<br /> def initialize(options={})<br /> @totalField=options[:totalField]<br /> @showField = options[:showField]<br /> @userField = options[:userField]<br /> @renameField=options[:renameField]<br /> @conditions=options[:conditions]<br /> end<br /> def generateTable<br /> @table=Product.report_table(:all,:only=>@showField,<br /> :include => { :user => {:only =>@userField } },<br /> :conditions=>@conditions)<br /> unless @renameField.empty?<br /> replaceColumnName()<br /> end</p><p> unless @totalField.empty?<br /> showTotal()<br /> end<br /> end<br /> def replaceColumnName<br /> unless @renameField.empty?<br /> @renameField.each do|key,value|<br /> @table.rename_column(key,value)<br /> transferShowField(key,value)<br /> end<br /> end<br /> end<br /> def transferShowField(key,value)<br /> for i in 0..@showField.length-1<br /> if(@showField[i]==key)<br /> @showField[i]=value<br /> end<br /> end<br /> end<br /> def showTotal<br /> total = {}<br /> for i in 0..@showField.length-1<br /> if(i==0)<br /> total.store(@showField[i],"Total")<br /> elsif(@showField[i]==@totalField)<br /> total.store(@showField[i],@table.sigma("price"))<br /> else<br /> total.store(@showField[i],"")<br /> end<br /> end<br /> @table<<total<br /> end<br />end

 

二、建立BaseController,實現Ruport::Controller應用

class BaseController < Ruport::Controller<br /> stage :product_sheet<br /> def setup<br /> self.data = ProductAggregator.new(:showField=>options[:showFields],<br /> :userField=>options[:userFields],<br /> :totalField=>options[:totalField],<br /> :renameField=>options[:renameField],<br /> :conditions=>options[:conditions]).generateTable<br /> end<br /> #等效於 class HTML < Ruport::Formatter::HTML<br /> formatter :html do<br /> build :product_sheet do<br /> output << textile("h3. Products List")<br /> output << data.to_html<br /> end<br /> end<br /> #等效於 class PDF < Ruport::Formatter::PDF<br /> formatter :pdf do<br /> build :product_sheet do<br /> pad(10) { add_text "Products List" }<br /> draw_table data<br /> end<br /> end</p><p> formatter :csv do<br /> build :product_sheet do<br /> output << data.to_csv<br /> end<br /> end</p><p>end<br />

 

三、在ProductsController中進行報表輸出應用

通過template的指定可動態傳遞不同的報表列印模板

def save_as_report<br /> Ruport::Formatter::Template.create(:simple) do |format|<br /> format.page = {:layout => :landscape}<br /> format.grouping = {:style => :separated}<br /> format.text = {:font_size => 16,:justification => :center}<br /> format.table = {:font_size => 10,:heading_font_size => 15,:maximum_width => 720,:width => 720}<br /> format.column = {:alignment => :center}<br /> format.heading = {:alignment => :center,:bold => true}<br /> end<br /> #介面傳參數<br /> pdf =BaseController.render_pdf(:showFields=>["description","title","price"],<br /> :userFields=>["username"],<br /> :totalField=>"price",<br /> :renameField=>{"description"=>"type","title"=>"name","user.username"=>"user"},<br /> :conditions=>["title like ?","%a%"],<br /> :template=>:simple)<br /> send_data pdf, :type => "application/pdf",<br /> :filename => "products.pdf"<br /> end

 

四、product/index.html.erb中調用報表列印

<%= link_to 'Save As Report', :controller=>"products",:action=>"save_as_report"%>

 

五、在routes.rb中指明save_as_report方法以get方式調用

#添加,:collection=>{:save_as_report=>:get}表示當遇到save_as_report時,用get方式,否則預設將跳轉到show.html執行查詢<br /> map.resources :products ,:collection => { :save_as_report => :get }

 

報表列印結果:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.