2014-11-14 84 views
0

我試圖將一組記錄導出到我的Redmine插件中的csv文件。記錄存儲在mysql數據庫中,該數據庫有一個列project_id,用於將每個記錄綁定到特定項目。我只想導出與project_id匹配的某些值的記錄。如何將數據導出到csv時包含參數?

應用程序/控制器/ foo_controller.rb:

before_filter :find_project 

def index 
    @foos = Foo.order(:id).where("project_id = ?", @project.id) # csv request throws NoMethodError here because @project is nil. 
    respond_to do |format| 
    format.html 
    format.csv { send_data @foos.to_csv(:col_sep => ",") } 
    end 
end 

private 
def find_project 
    if params[:project_id].present? 
    @project = Project.find params[:project_id] 
    end 
end 

init.rb

Redmine::Plugin.register :foo_plugin do 
    # Some info stuff... 
    # Some module/permission stuff... 

    menu :project_menu, :foos, {:controller => 'foo_con', :action => 'index'}, :caption => 'Foos', :param => :project_id 

end 

從我所知道的,問題出在CSV請求是如何在軌處理。首次加載索引頁時,params陣列中將自動包含project_id。但是,當它重新加載index來處理csv請求時,project_id不會被添加到params陣列中。有什麼方法可以改變這種行爲嗎?

回答

0

我沒有看到任何鏈接創建.csv請求。包括:format => 'csv'在您的菜單鏈接。

此外,您可能需要在您的send_data中輸出一些額外信息。例如:

format.csv { send_data(@foos.to_csv, :type => 'text/csv; header=present', :filename => 'issues.csv') } 

在一個側面說明,管理平臺已建成CSV導出一個有效@query。在queries_helper.rb

cond = "project_id IS NULL" 
cond << " OR project_id = #{@project.id}" if @project 
@query = IssueQuery.where(cond) 

respond_to do |format| 
    # ... 
    format.csv { send_data(query_to_csv(@issues, @query, params), :type => 'text/csv; header=present', :filename => 'issues.csv') } 
    # ... 

query_to_csv功能:您可以通過做這樣的事情趁

def query_to_csv(items, query, options={}) 
    encoding = l(:general_csv_encoding) 
    columns = (options[:columns] == 'all' ? query.available_inline_columns : query.inline_columns) 
    query.available_block_columns.each do |column| 
     if options[column.name].present? 
     columns << column 
     end 
    end 

    export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| 
     # csv header fields 
     csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c.caption.to_s, encoding) } 
     # csv lines 
     items.each do |item| 
     csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(csv_content(c, item), encoding) } 
     end 
    end 
    export 
    end