在rails中,如何将logging作为csv文件返回

我有一个简单的数据库表名为“条目”:

class CreateEntries < ActiveRecord::Migration def self.up create_table :entries do |t| t.string :firstName t.string :lastName #etc. t.timestamps end end def self.down drop_table :entries end end 

如何编写一个处理程序,将CSV文件作为参数表格的内容返回(理想情况下,它将自动在Excel中打开)?

 class EntriesController < ApplicationController def getcsv @entries = Entry.find( :all ) # ??? NOW WHAT ???? end end 

有一个名为FasterCSV的插件可以很好地处理这个插件。

FasterCSV肯定是要走的路,但是如果你想直接从你的Rails应用程序来提供它,你也需要设置一些响应标题。

我保持一个方法来设置文件名和必要的标题:

 def render_csv(filename = nil) filename ||= params[:action] filename += '.csv' if request.env['HTTP_USER_AGENT'] =~ /msie/i headers['Pragma'] = 'public' headers["Content-type"] = "text/plain" headers['Cache-Control'] = 'no-cache, must-revalidate, post-check=0, pre-check=0' headers['Content-Disposition'] = "attachment; filename=\"#{filename}\"" headers['Expires'] = "0" else headers["Content-Type"] ||= 'text/csv' headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" end render :layout => false end 

使用它可以很容易地在我的控制器中有这样的东西:

 respond_to do |wants| wants.csv do render_csv("users-#{Time.now.strftime("%Y%m%d")}") end end 

有一个看起来像这样的看法:( generate_csv是从FasterCSV)

 UserID,Email,Password,ActivationURL,Messages <%= generate_csv do |csv| @users.each do |user| csv << [ user[:id], user[:email], user[:password], user[:url], user[:message] ] end end %> 

我接受了(并且投了!)@ Brian的答案,首先指向我FasterCSV。 然后当我search到gem时,我也在这个wiki页面find了一个相当完整的例子。 把它们放在一起,我就决定了下面的代码。

顺便说一句,安装gem的命令是:sudo gem install fastercsv(全部小写)

 require 'fastercsv' class EntriesController < ApplicationController def getcsv entries = Entry.find(:all) csv_string = FasterCSV.generate do |csv| csv << ["first","last"] entries.each do |e| csv << [e.firstName,e.lastName] end end send_data csv_string, :type => "text/plain", :filename=>"entries.csv", :disposition => 'attachment' end end 

另一种不使用FasterCSV的方法:

需要在初始化文件像config / initializers / dependencies.rb ruby​​的csv库

 require "csv" 

作为一些背景下面的代码是基于Ryan Bate的高级search表单创build一个search资源。 在我的情况下,search资源的显示方法将返回以前保存的search结果。 它也响应csv,并使用视图模板来格式化所需的输出。

  def show @advertiser_search = AdvertiserSearch.find(params[:id]) @advertisers = @advertiser_search.search(params[:page]) respond_to do |format| format.html # show.html.erb format.csv # show.csv.erb end end 

show.csv.erb文件如下所示:

 <%- headers = ["Id", "Name", "Account Number", "Publisher", "Product Name", "Status"] -%> <%= CSV.generate_line headers %> <%- @advertiser_search.advertisers.each do |advertiser| -%> <%- advertiser.subscriptions.each do |subscription| -%> <%- row = [ advertiser.id, advertiser.name, advertiser.external_id, advertiser.publisher.name, publisher_product_name(subscription), subscription.state ] -%> <%= CSV.generate_line row %> <%- end -%> <%- end -%> 

在报告页面的html版本中,我有一个链接来导出用户正在查看的报告。 以下是返回报告的csv版本的link_to:

 <%= link_to "Export Report", formatted_advertiser_search_path(@advertiser_search, :csv) %> 

看看FasterCSV的gem。

如果你只需要支持excel,你也可以直接生成一个xls。 (请参阅Spreadsheet :: Excel)

 gem install fastercsv gem install spreadsheet-excel 

我发现这些选项很适合在Windows Excel中打开csv文件:

 FasterCSV.generate(:col_sep => ";", :row_sep => "\r\n") { |csv| ... } 

至于ActiveRecord部分,像这样的事情会做:

 CSV_FIELDS = %w[ title created_at etc ] FasterCSV.generate do |csv| Entry.all.map { |r| CSV_FIELDS.map { |m| r.send m } }.each { |row| csv << row } end 

您需要在响应中设置Content-Type标头,然后发送数据。 Content_Type:application / vnd.ms-excel应该可以做到。

您可能还需要设置Content-Disposition标题,使其看起来像一个Excel文档,浏览器select一个合理的默认文件名; 这就像Content-Disposition:附件; 文件名= “#{suggested_name}的.xls”

我build议使用fastercsv ruby​​ gem来生成你的CSV,但也有一个内置的csv。 更快速的示例代码(来自gem的文档)看起来像这样:

 csv_string = FasterCSV.generate do |csv| csv << ["row", "of", "CSV", "data"] csv << ["another", "row"] # ... end 

下面的方法对我的情况非常有效,并且使得浏览器在下载之后为CSVtypes打开适当的应用程序。

 def index respond_to do |format| format.csv { return index_csv } end end def index_csv send_data( method_that_returns_csv_data(...), :type => 'text/csv', :filename => 'export.csv', :disposition => 'attachment' ) end 

尝试一个很好的gem从Rails https://github.com/crafterm/comma生成CSV

看看CSV Shaper的gem。

https://github.com/paulspringett/csv_shaper

它有一个很好的DSL,并与Rails模型非常相称。 它还处理响应头文件并允许文件名自定义。

如果你只是想从控制台上自己获取csv数据库,你可以通过几行来完成

 tags = [Model.column_names] rows = tags + Model.all.map(&:attributes).map(&:to_a).map { |m| m.inject([]) { |data, pair| data << pair.last } } File.open("ss.csv", "w") {|f| f.write(rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join(""))}