開發環境:
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 }
報表列印結果: